我想生成0和40(含)之间的随机数。 所以,我实现的代码是这个 -
y=rand()%41;
但是每次我点击编译和运行命中。 它输出相同的随机数。 正如例如说我在一个循环跑了这一点。
for(i=0;i<4;i++)
{
y=rand()%41;
printf("%d ",y);
}
每一次,输出是一样的4个数字。 它总是输出14,2,等等等等在终端上。 无论。
所以我的第一个问题是,为什么会出现这种情况?
其次,如何做C中的随机数生成器的工作?
我想,既然我有time.h中图书馆,通过一些标准算法,使用该系统时所产生的数字。 而且,由于系统时间是不断变化的,即产生也应该改变每次的数字我运行程序。
rand()
仅生成伪随机数。 这意味着,每次你运行你的代码时,你会得到完全相同的数字序列。
考虑使用
srand(time(NULL))
让每一次不同的号码。 事实上可能实施rand
是
next = next * 1103515245 + 12345;
return (UINT32)(next>>16) & RAND_MAX;
其中next
被定义为
static UINT32 next = 1;
调用srand()
有改变的初始值的影响next
,从而改变了“下一个”值你的结果。
至于它是如何工作的,它依赖。 许多实施方式使用线性同余发生器 ,具有不同的参数。
用于算法rand
是由C标准指定,
通过规范,如果你不调用srand
到呼叫之前rand
在你的程序,这是因为如果srand(1)
被称为:种子值将是1
在程序的每次执行而产生的顺序将是永远的相同。
有该程序的不同执行不同的种子的一种常见方法是使用依赖于当前时间等种子:
srand(time(NULL));
This is actually a FAQ on comp.lang.c. Here's the solution that they suggest:
(int)((double)rand() / ((double) RAND_MAX + 1) * N )
Where N
is the ceiling of your range of random numbers. This is because the low order bits on bad C compilers are "shockingly non-random". This doesn't get around the need for using srand(). Note, however that srand( time(NULL) ) should be called outside of your loop... time() has a resolution of 1 second, so calling it inside of the loop will re-initialize your random number generator to the same seed many times in a row.
The need for this is probably largely historical, I'm sure that modern compilers probably don't have random number generators which emit really bad random numbers, but I remember writing a program using the Borland C compiler which would cycle through about 5 numbers when I used rand() % 41
repeatedly.
原因是RAND()使用您运行相同的播种每次。 你必须自己播种了。 函数srand(时间(NULL));`通常用来初始化随机种子。
它是由一个参数传递种子生成的。 为了产生不同的数字调用之前添加此rand()
函数:
srand (time(NULL));
这会产生一个新的随机种子。
你应该有这个库: #include <time.h>
如果你仍然有一个错误使用这一个还有: #include <stdlib.h>