获取随机数

获取随机数

一、C++11 方式

  • random_device 对象,他为随机引擎种子生成不确定的随机位,这对于避免产生相同的数字序列非常重要
  • random engine:生成随机的 bit 流。
  • distribution:生成满足用户需求的随机数
1
2
3
4
5
6
std::random_device rd;
std::default_random_engine eng(rd());
std::uniform_int_distribution<int> distr(1, 100);
for (int i = 0; i < 10; ++i) {
std::cout << distr(eng) << " ";
}
  • uniform_int_distribution:均匀分布模板类,类名字中的 int 不代表整形,而是表示整数。因为他是一个模板类,可以用 int、long、short 等整数类型来实例化。

    注意:随机数的范围是左闭右闭,也就是 [ ]

    如果 uniform_int_distribution 使用了无参构造函数,那么其随机数的范围是:[0, numberic_limits<type>::max()]。也就是最大值为对应实例化类型所能表示的最大值

  • uniform_real_distribution<T> :表示浮点数模板类,可以用 float、double 来实例化。

    注意:随机数的范围是左闭右开,也就是 [ )

    对于 uniform_real_distribution 的无参构造函数,则是 [0, 1)

二、C 语言的 random

  • 使用 srand 生成种子,一般使用 time(NULL) 为参数
  • 调用 rand 生成随机数
1
2
3
4
srand(time(NULL));
for (int i = 0; i < 10; ++i) {
std::cout << rand() % 100 << " ";
}

使用 rand_r 来生成随机数

1
2
3
4
5
6
7
# 每次使用 rand_r 的时候需要传给该函数一个随机数种子的指针
int rand_r(unsigned int *seedp);

unsigned int local_seed = time(NULL);
for () {
x = rand_r(&local_seed) / xxx;
}