随机数发生器如何在C中工作?
我正在尝试生成0到40(含)之间的随机数。 所以我实施的代码就是 –
y=rand()%41;
但是每次我点击编译并点击Run。 它输出相同的随机数。 比如说,例如我在循环中运行它。
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
的初始值,从而改变你得到的“next”值。
至于它是如何工作的,取决于它。 许多实现使用具有不同参数的线性同余生成器 。
用于rand
的算法未被C标准指定,
按照规范,如果在程序中调用rand
之前没有调用srand
,就好像srand(1)
:每次执行程序时种子值都是1
,生成的序列将始终是相同。
为程序的不同执行使用不同种子的常用方法是使用取决于当前时间的种子,如:
srand(time(NULL));
这实际上是comp.lang.c上的FAQ。 以下是他们建议的解决方案:
(int)((double)rand() / ((double) RAND_MAX + 1) * N )
其中N
是随机数范围的上限。 这是因为坏C编译器上的低位比特是“令人震惊的非随机”。 这并不需要使用srand()。 请注意,srand(time(NULL))应该在循环之外调用… time()的分辨率为1秒,因此在循环内调用它会将随机数生成器重新初始化为相同的种子连续多次。
对此的需求可能在很大程度上是历史性的,我确信现代编译器可能没有随机数发生器,它们发出非常糟糕的随机数,但我记得使用Borland C编译器编写一个程序,当使用Borland C编译器时会循环显示大约5个数字。我反复使用rand() % 41
。
原因是每次运行时rand()都使用相同的种子。 你必须自己播种。 srand(time(NULL));`通常用于初始化随机种子。
它是由传递种子的参数生成的。 要生成不同的数字,请在调用rand()
函数之前添加:
srand (time(NULL));
这会生成一个新的随机种子。
你应该有这个库: #include
如果你还有错误,也可以使用这个: #include