【发布时间】:2015-11-19 03:27:05
【问题描述】:
假设我有这个循环:
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。所以我想如果它是一个大循环,它确实会显着降低性能。
【问题讨论】:
-
对随机发生器播种一次应该足以满足大多数应用程序的需要。否则,无论如何您都应该研究其他(更专业的)随机发生器。
-
如果你想要真正随机的东西,那么你不应该使用
rand()/srand()。改用英特尔安全密钥(自 2006 年起在英特尔 CPU 上可用)。 -
问题是为什么您想要多次播种。这就像在问:“我需要一座红色的房子。我的房子可以涂红 100 次而不是一次吗?”
-
谢谢,现在清楚多了。我并不是要将它用于非常安全的事情。它仅适用于小型游戏等。请参阅编辑。
-
您可以使用静态变量来记住您是否已经播种。静态 int 播种 = 0; if(!seed) { srand(...);播种=1; }
标签: c loops random random-seed