用rand生成一个随机数

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次三次。

非常感谢,

你在循环播种(因为循环执行的速度相同,所以产生的随机数每次都是相同的)。

你需要将你的种子函数移到循环之外

 /* Initialize random number */ srand((unsigned int)time(NULL)); for(i = 0; i < 3; i++) { /* Added random number (simulate seconds) */ add((rand() % 30) + 1); } 

您只需在程序开始时调用srand一次。

srand使用时间以秒为单位初始化伪随机数生成器。 如果您使用特定的号码进行初始化,您将始终得到相同的数字序列。 这就是为什么你通常要在开始时使用时间来初始化它(每次运行程序时种子是不同的),然后只用rand来产生看似随机的数字。

在你的情况下,时间不会从迭代变为迭代,因为它的分辨率只有1秒,所以你总是得到伪随机序列的第一个数字,总是相同的。

你只需要在循环之前做一次srand((unsigned int)time(NULL))

3次17完全可能是完全随机的。

当使用1-30和三次select的范围时,大约有十分之一的机会得到两个数字。 (这是由于生日问题 )

现在,得到三个相同的结果仍然是在900中使用相同的范围1的可行性。

你可能想阅读random.org分析页面的更多背景

种子到伪随机数字发生器只能在循环外部调用一次。 用时间作为种子是件好事。 但是仍然有可能获得相同的随机数。

我宁愿build议使用gettimeofday()系统调用来检索要用于提供srand()的种子。

就像是

struct timeval tv; ... gettimeofday(&tv, NULL); srand(tv.tv_usec); ...
struct timeval tv; ... gettimeofday(&tv, NULL); srand(tv.tv_usec); ... 

这种方法可以在伪数生成代码中添加更多的熵。 恕我直言,当然

瞧瞧