随机数和多个srand调用

ceg*_*ult 6 c random srand

我正在编写一个程序,它将在循环中生成大量随机数.我试图让数字更难以预测(不仅是为了安全,而是为了避免多线程上的冲突).

我注意到许多文档建议srand在程序中只调用一次.例如:C中的随机数,所选答案是"作为一般规则,在程序中只调用srand()一次".

但为什么?做这样的事情为什么会这么糟糕:

int THIS_THREAD_SEED;
int randomness() {
    ++THIS_THREAD_SEED;
    int i;
    for(i=0 i<1000; i++) {
        unsigned n = rand_r(&THIS_THREAD_SEED) / RAND_MAX;
        /* do something with n */
    }
    return 0;
}

int do_something() {
    int i;
    for(i=0; i<1000; i++) {
        randomness();
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,每个函数调用一次更改种子,而不是每个程序一次.这样,无论运行多少个线程,没有两个线程都会有相同的随机数列表......对吗?

更新 假设我为每个线程都有一个唯一的种子,或者在全局SEED上使用互斥锁来防止竞争条件.

len*_*nik 2

让我们把这个问题分成两个单独的问题。

  1. 如果您在访问随机数生成器时担心竞争条件,请创建互斥锁或其他同步原语以避免这种情况。

  2. 如果您想srand()多次打电话,请不要这样做。其背后的原因是基于种子设置变量的随机生成器初始化例程具有较差的随机特性,其性能比随机生成器本身更差,因此不应用作替代品。