2

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

 y=rand()%41;

但是每次我点击编译并点击运行。它输出相同的随机数。例如,我在一个循环中运行它。

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

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

所以我的第一个问题是,为什么会这样?

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

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

4

6 回答 6

2

rand() generates only pseudorandom numbers. This means that every time you run your code you will get exactly the same sequence of numbers.

Consider using

srand(time(NULL))

to get every time different numbers. In fact a possible implementation for rand is

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

where next is defined as

static UINT32 next = 1;

Calling srand() has the effect of changing the initial value of next, thus changing the "next" value you get as result.

于 2012-04-07T13:37:19.987 回答
2

这实际上是一个关于 comp.lang.c 的常见问题解答。这是他们建议的解决方案:

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

N你的随机数范围的上限在哪里。这是因为糟糕的 C 编译器上的低位是“令人震惊的非随机”。这并不能解决使用 srand() 的需要。但是请注意,应该在循环之外调用 srand( time(NULL) ) ... time() 的分辨率为 1 秒,因此在循环内部调用它会将随机数生成器重新初始化为相同的种子连续多次。

对此的需求可能在很大程度上是历史性的,我确信现代编译器可能没有随机数生成器会发出非常糟糕的随机数,但我记得使用 Borland C 编译器编写了一个程序,它会在大约 5 个数字时循环我rand() % 41反复使用。

于 2012-04-07T14:46:08.187 回答
2

至于它是如何工作的,这取决于。许多实现使用具有不同参数的线性同余生成器。

于 2012-04-07T13:44:35.927 回答
2

randC标准未指定用于的算法,

根据规范,如果您在程序中的调用srand之前不调用rand,就好像srand(1)被调用了:种子值将1在程序的每次执行时出现,并且生成的序列将始终相同。

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

srand(time(NULL));  
于 2012-04-07T14:03:25.417 回答
1

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

srand (time(NULL));

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

你应该有这个库:#include <time.h>如果你仍然有错误使用这个库:#include <stdlib.h>

于 2012-04-07T13:36:22.353 回答
1

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

于 2012-04-07T13:39:26.037 回答