c - 如果这样做的话,可以多次播种随机发生器吗?

标签 c loops random random-seed

假设我有这个循环:

for (i=0; i < 100; i++)
{
    srand(time(NULL));
    printf("%d\n", rand());
}

如果我的机器相当快,它应该打印相同的数字 100 次。

但是如果我这样修改它:

for (i=0; i < 100; i++)
{
    srand(time(NULL) + rand());
    printf("%d\n", rand());
}

然后它应该打印 100 个不同的数字。我的问题是,像这样播种随机发生器有什么问题吗?那效率呢?是否会显着降低效率?

一个附带问题,如果我在 main() 函数中植入随机数发生器一次,对于其他函数是否也足够(即我不需要在另一个使用它的函数中再次植入它) rand())?

编辑

我可能需要使用这种方式是有原因的(当然除非有更好的方式我不知道)。假设我有一个自定义库,其中的函数使用 rand()。但该函数不知道随机发生器之前是否已播种。在这种情况下,我将 srand(time(NULL) + rand()) 放入该函数中,以确保随机化器已播种,即使之前未播种。

示例:

int main()
{
    int i;

    srand(time(NULL));  // Seeded here, but the print_rand() function does not know it

    for (i=0; i < 100; i++)
    {
        print_rand();
    }

    return(0);
}


// Pretend this function is in a library
void print_rand()
{
    srand(time(NULL) + rand()); // No guarantee if seeding was done before, so doing it here

    printf("%d\n", rand());
}

编辑2

我刚刚用 1000000 次循环对其进行了测试。播种一次需要 0.024s,每次播种需要 4.972s。所以我想如果它是一个大循环,它确实会导致性能显着下降。

最佳答案

不要这样做。

播种一次。

srand(time(NULL) + rand());如果重复使用会引入统计偏差。直观上,这是由于两个影响:(i) srand(rand())将有效地忽略所有其他会增加方差的数字,并且 (ii) srand(time(NULL))将引入一个额外的加法常量,这将导致生成器中的模运算符被比应有的情况更频繁地调用。您甚至可能会损害生成器的周期性。

为什么不测试一下呢?我预计平均值将大致正确,但我想象方差和更高的时刻将会关闭。

关于c - 如果这样做的话,可以多次播种随机发生器吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32203768/

相关文章:

c - 为什么我的 C 程序不打印任何内容?

python - 将python for循环转换为while循环

php - 这段PHP代码可以去掉for循环吗?

c - 从 Postgres C 函数中的复合类型参数访问时间戳数组

c - 通过指针表示法写入二维数组

c++ - 分配字符串指针字符串值时出现问题

java : Loop through two ArrayLists without ListIterators using abstract data types

python - 创建大于该范围的随机样本

c++ - 将a==b作为参数传递给uniform_real_distribution ok

php - 用php打乱从mysql中提取的名字顺序