望山居

真相本来是一体的,太大了,所以大家给他画了格子,结果把自己困了起来

导航

C++的rand()

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系列函数。

posted on 2022-09-13 12:59  穆道  阅读(192)  评论(0编辑  收藏  举报