随机数发生器如何在C中工作?

时间:2012-04-07 13:32:48

标签: c random generator

我正在尝试生成0到40(含)之间的随机数。 所以我实现的代码就是这个 -

 y=rand()%41;

然而每次我点击编译并点击Run。它输出相同的随机数。 比如说,例如我在循环中运行它。

for(i=0;i<4;i++)
{
     y=rand()%41;
     printf("%d ",y);
}

每次输出都是相同的4个数字。它总是在终端输出14,2等。无论如何。

所以我的第一个问题是,为什么会发生这种情况?

其次,随机数发生器如何在C中工作?

我认为因为我包含了time.h库,所以使用系统时间通过一些标准算法生成数字。由于系统时间不断变化,每次运行程序时生成的数字也应该改变。

6 个答案:

答案 0 :(得分:2)

rand()仅生成伪随机数。这意味着每次运行代码时,您都会获得完全相同的数字序列。

考虑使用

srand(time(NULL))

每次获得不同的数字。实际上rand的可能实现是

next = next * 1103515245 + 12345;
return (UINT32)(next>>16) & RAND_MAX;

其中next定义为

static UINT32 next = 1;

调用srand()会改变next的初始值,从而更改您获得的“下一个”值。

答案 1 :(得分:2)

至于它是如何工作的,取决于它。许多实现使用Linear Congruential Generator,具有不同的参数。

答案 2 :(得分:2)

用于rand的算法未由C标准

指定

根据规范,如果您在程序中调用srand之前没有致电rand,就好像调用了srand(1):种子值将是{{1在每次执行程序时,生成的序列将始终相同。

为程序的不同执行设置不同种子的常用方法是使用取决于当前时间的种子,如:

1

答案 3 :(得分:2)

这实际上是关于comp.lang.c的FAQ。以下是他们建议的解决方案:

(int)((double)rand() / ((double) RAND_MAX + 1) * N )

N是您的随机数范围的上限。这是因为坏C编译器上的低位比特是“令人震惊的非随机”。这并不需要使用srand()。注意,但是srand(time(NULL))应该在你的循环中被称为 outside ... time()的分辨率是1秒,所以在循环中调用它会重新初始化你的随机数生成器连续多次生成相同的种子。

对此的需求可能主要是历史性的,我确信现代编译器可能没有随机数发生器,它们发出非常糟糕的随机数,但我记得使用Borland C编译器编写一个程序,它会绕过我反复使用rand() % 41时的5个数字。

答案 4 :(得分:1)

它是由传递种子的参数生成的。要生成不同的数字,请在调用rand()函数之前添加此项:

srand (time(NULL));

这会生成一个新的随机种子。

您应该拥有此库:#include <time.h>如果您仍然遇到错误,请使用此库:#include <stdlib.h>

答案 5 :(得分:1)

原因是每次运行时rand()都使用相同的种子。你必须自己播种。 srand(time(NULL));`通常用于初始化随机种子。