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