C++ 中的随机数
rand() is not generated for thread-safet
rand() 不随机的问题
直接使用rand()
函数, 会返回一个在 [0, RAND_MAX] 区间的 伪随机整数
; 所以在两次相同的顺序调用中, 会出现重复的情况;
在调用rand之前, 需要使用 srand 设置接下来随机生成数的种子值;然后会获得我们看起来随机的一组数字;
随机数的计算是一系列复杂的计算机数学理论, 后面有时间会做进一步的探索
void main() // 两次运行的显示结果一致
{
// sranc(time(NULL))
for(int i : 10)
{
cout << rand() << endl;
}
// 41
// 18467
// 6334
// 26500
// 19169
// 15724
// 11478
// 29358
// 26962
// 24464
}
rand() 使用的注意事项
rand()
并不能保证真正意义上的随机, 从上面的例子可以看出, 在大的范围内任然是遵循某个函数的定义. 所以 rand() 的很多实现, 生成的随机序列在随机性, 分布性, 周期性上都存在缺陷. 这个方法并不推荐在要求严谨的随机数的算法中使用, 比如密码学中;
POSIX要求rand使用的伪随机数生成器的周期至少为232, 并且提供了一个称为rand_r的线程安全版本,该版本已经过时,支持drand48系列函数。