gcc 4.4.4 c89
我正在使用以下代码。但是,我一直得到相同的数字:
size_t i = 0;
for(i = 0; i < 3; i++) {
/* Initialize random number */
srand((unsigned int)time(NULL));
/* Added random number (simulate seconds) */
add((rand() % 30) + 1);
}
我想回到0到30。但是,我最后一次跑这个,我三次得了17次。
非常感谢,
答案 0 :(得分:22)
你正在循环中 循环(由于循环的执行速度有相同的值),这导致每次生成的随机数相同。
您需要将种子函数移到循环之外:
/* Initialize random number */
srand((unsigned int)time(NULL));
for(i = 0; i < 3; i++) {
/* Added random number (simulate seconds) */
add((rand() % 30) + 1);
}
答案 1 :(得分:9)
你需要在程序开始时只调用一次srand。
srand
使用时间以秒为单位初始化伪随机数生成器。如果使用特定数字对其进行初始化,则始终会获得相同的数字序列。这就是为什么你通常想要在开始时使用时间初始化它(这样每次运行程序时种子都不同)然后只使用rand
来生成看似随机的数字。
在你的情况下,时间不会从迭代变为迭代,因为它的分辨率只有1秒,所以你总是得到伪随机序列的第一个数字,它始终是相同的。
答案 2 :(得分:4)
你需要在循环之前只进行一次srand((unsigned int)time(NULL))
。
答案 3 :(得分:2)
完全有可能3次17仍然是完全随机的。
当使用1-30和3个选择范围时,有大约十分之一的机会让两个数字相同。 (这是由于birthday problem)
现在,使用相同的范围得到三个相同的结果仍然是900的1。
您可能希望阅读有关analysis page of random.org
的更多背景信息答案 4 :(得分:1)
种子到伪随机数生成器只应在循环外调用一次。用时间作为种子是好事。 但是仍然有可能获得相同的随机数。
答案 5 :(得分:1)
我建议还使用gettimeofday()系统调用来检索用于提供srand()的种子。
像
这样的东西
struct timeval tv;
...
gettimeofday(&tv, NULL);
srand(tv.tv_usec);
...
此方法可以在伪数生成代码中添加更多熵。 恕我直言
Ciao ciao