#include <stdio.h>
#include <stdlib.h>
int main()
{
int randomnumber;
randomnumber = rand() % 10;
printf("%d\n", randomnumber);
return 0;
}
这是一个简单的程序,其中randomnumber是一个未初始化的int变量,意味着打印为1到10之间的随机数。但是,每当我反复运行时,它总是打印相同的数字。有人可以帮忙告诉我为什么会这样吗?谢谢。
每次执行都需要不同的种子。
您可以在程序开头调用:
srand(time(NULL));
请注意,% 10
产生的结果是从0
到9
,而不是从1
到10
:只需将1
添加到你的%
表达式中,就可以将1
添加到10
。
您需要从man 3 rand
播种随机数生成器
如果未提供种子值,则rand()函数将自动播种,值为1。
和
srand()函数将其参数设置为rand()返回的新的伪随机整数序列的种子。通过使用相同的种子值调用srand(),可以重复这些序列。
EG
srand(time(NULL));
在程序中生成单个随机数是有问题的。在重复调用从给定概率分布产生数字的意义上,随机数生成器仅是“随机的”。
播种RNG无济于事,特别是如果您只是从低分辨率计时器中播种它。你只需要获得时间哈希函数的数字,如果你经常调用程序,它们可能不会经常更改。你可以通过使用srand(time(NULL) + getpid())
(Windows上的_getpid()
)来改进一点,但这仍然不是随机的。
在程序的多次调用中获取随机数的唯一方法是从程序外部获取它们。这意味着使用/dev/random
(Linux)或CryptGenRandom()
(Windows)等系统服务,或者使用random.org
等服务。
这是一个随机数生成器的源代码,使用来自该站点的c:http://www.random-number.com/random-number-c/。这里的实现更通用(获得3个参数的函数:min,max和要生成的随机数的数量)
#include <time.h>
#include <stdlib.h>
#include <stdio.h>
// the random function
void RandomNumberGenerator(const int nMin, const int nMax, const int nNumOfNumsToGenerate)
{
int nRandonNumber = 0;
for (int i = 0; i < nNumOfNumsToGenerate; i++)
{
nRandonNumber = rand()%(nMax-nMin) + nMin;
printf("%d ", nRandonNumber);
}
printf("\n");
}
void main()
{
srand(time(NULL));
RandomNumberGenerator(1,70,5);
}
srand(time(NULL));
int nRandonNumber = rand()%((nMax+1)-nMin) + nMin;
printf("%d\n",nRandonNumber);