可能重复:
why do i always get the same sequence of random numbers with rand() ?
到目前为止,这是我的文件:
#include <stdio.h>
int main(void) {
int y;
y = generateRandomNumber();
printf("\nThe number is: %d\n", y);
return 0;
}
int generateRandomNumber(void) {
int x;
x = rand();
return x;
}
我的问题是rand()总是返回41.我在win上使用gcc ...不知道该怎么做。
编辑:使用时间生成随机数将无效。它为我提供了一个数字(12000),每次我调用它只是稍微高一点(大约每秒+3)。这不是我需要的随机性。我该怎么办?
答案 0 :(得分:8)
你需要提供种子。
来自互联网 -
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{
int i, stime;
long ltime;
/* get the current calendar time */
ltime = time(NULL);
stime = (unsigned) ltime/2;
srand(stime);
for(i=0; i<10; i++) printf("%d ", rand());
return 0;
}
答案 1 :(得分:8)
标准技巧是:
srand(time(0)); // Initialize random number generator.
注意:该功能为srand
,而不是rand
。
在main
功能中执行此操作一次。之后,只需拨打rand
即可获取号码。
根据实现情况,它还可以帮助获取和丢弃rand
的一些结果,以允许序列偏离种子值。
答案 2 :(得分:4)
在致电srand(time(NULL));
之前,请尝试拨打generateRandomNumber
。
正如其他人所说,您需要在应用程序启动时拨打srand()
一次,而不是每次拨打rand()
时都会。{/ p>
答案 3 :(得分:4)
如果每次运行程序时都不需要相同的数字序列,则应在程序启动时设置种子(使用srand()
),其值从一次运行更改为另一次运行。
时钟时间是一个受欢迎的选择,但请记住,这是可预测的,因此如果您希望您的数字序列不可预测,则可能是一个漏洞。
答案 4 :(得分:2)
有时编译器使用相同的随机种子来帮助调试更容易,这很好但是无法实现随机化的目的。有关于如何使用某些数据集为随机生成器设定种子的代码示例,通常是系统时间,但这就是为什么一遍又一遍地获得相同数字的原因。
答案 5 :(得分:1)