【C++】随机数

  1. 在新标准之前,C/C++都依赖于一个简单C库函数rand来生成随机数;此函数生成均匀分布的伪随机整数,每个随机数的范围在:0和一个系统相关的最大值(最少为32767)之间;由于不同程序对随机数的类型、范围、分布要求可能不同,此时通过rand函数转换来满足多种随机数要求通常会引入非随机性
  2. 定义在random头文件中的随机数库,通过一组协作的类来解决上述问题:随机数引擎类随机数分布类;引擎类可以生成unsigned随机数序列,分布类使用引擎类生成指定类型的、在给定范围内的、服从特定概率分布的随机数
  3. C++程序不应该使用库函数rand,而应使用defaulet_random_engine类和恰当的分布类对象
  4. 大多数场合下,随机数引擎的输出不可直接使用;因为输出的值范围通常与需要的不符,也称之为原始随机数;随机数引擎有很多中,具体可见P783页,通常defaulet_random_engine引擎操作可见test_1
  5. 将随机数引擎传递给分布对象,而不是引擎的下一个值;见test_2
  6. 一个给定的随机数发生器一直会生成相同的随机数序列,一个函数如果定义了局部的随机数发生器,应将随机数引擎和分布对象定义为static的。否则,每次调用函数都会生成相同的序列
  7. 常见的随机数引擎和随机数分布在 p781-p783
/**
 * @Author: phd
 * @Date: 2020/1/12
 * @Site: github.com/phdsky
 * @Description: NULL
 */

#include 
#include 
#include 

using namespace std;

void print_random_k_values(default_random_engine &rng, int k) {
  for (size_t i = 0; i < k; ++i) {
    // use e() to call next random number
    cout << rng() << " ";
  }
  cout << endl;
}

void test_1() {
  int k_value = 10;
  default_random_engine rng;
  print_random_k_values(rng, k_value);

  int int_value = 233;
  default_random_engine another_rng(int_value);
  print_random_k_values(another_rng, k_value);

  rng.seed(int_value);
  print_random_k_values(rng, k_value);

  cout << "RNG min value: " << rng.min() << endl;
  cout << "RNG max value: " << rng.max() << endl;

  default_random_engine::result_type rng_type = 23333;
  cout << typeid(rng_type).name() << endl;
  cout << typeid(rng()).name() << endl;

  // random generator name
  cout << typeid(rng).name() << endl;
}

void test_2() {
  uniform_int_distribution<unsigned> u(0, 9);
  default_random_engine e;
  for (size_t i = 0; i < 10; ++i) {
    // cout << u(e()) << endl; // error: no matching function for call to object of type 'uniform_int_distribution'
    cout << u(e) << " ";
  }
  cout << endl;
}


int main(int argc, char *argv[]) {
  test_1();
  test_2();

  return 0;
}

你可能感兴趣的:(编程基础,随机数,随机数引擎,随机数分布,C++)