为什么每次编译和运行时都会得到与rand()相同的结果?
每当我运行这个代码,我得到一个相同的结果。
程序
#include<stdlib.h> int main(int agrc, const char *argv[]) { int i = rand(); printf("%d\n",i); for(i=0;i<10;i++) { printf("%d\n",rand()); } }
结果:
41 18467 6334 26500 19169 15724 11478 29358 26962 24464 5705
我把这个放在了mingw
其实我正在学习Objective-C
请帮帮我。
在使用之前,您需要使用唯一的数字对rand函数进行种子处理。 最简单的方法是使用time()
例如
srand(time(NULL)); rand();//now returns a random number
原因是rand()(或任何其他基于algorithm的函数)提供的随机数不是随机的。 rand函数只取其当前数值状态,应用转换,将转换结果保存为新状态并返回新状态。
所以为了让rand返回不同的伪随机数,你首先必须把rand()的状态设置为唯一的。
你想初始化PRNG。
通过调用srand()
函数初始化一次 (通常在main()
)。
如果您不初始化PRNG,则默认情况下将其初始化为值1
。 当然,用其他一些常数初始化它并不会为程序的不同运行给出不同的伪随机数。
srand(1); /* same as default */ srand(42); /* no gain, compared to the line above */
您需要使用随程序的每次运行而更改的值进行初始化。 从time()
函数返回的值是最经常使用的值。
srand(time(NULL)); /* different pseudo random numbers almost every run */
time(NULL)
问题time(NULL)
是它在同一秒内返回相同的值。 所以,如果你在同一天的11:35:17打电话给你的程序两次,你将得到相同的伪随机数。
为了补充Yacoby的回答 – 我有点惊讶,它没有默认基于时间的种子,所以我查了一下man page :
如果没有提供种子值,则rand()函数自动以1的值进行播种。
所以,如果你改变你的代码使用seed(1)
你仍然应该看到相同的输出 – 但seed(time())
会使它每次都改变。
rand的输出是伪随机数,这意味着它看起来是有效的随机数,但是每次从相同的方式计算,从一个叫做种子的特殊值开始。 使用相同的种子值,可以得到相同的随机数序列。
要设置不同的种子,在开始生成随机数之前,在代码中使用标准的C函数void srand(unsigned int) 。 每次运行程序时获取不同序列的随机数的一种常见方法是在时钟时间基础上设置种子。 例如srand(clock())