对于以下代码:
#include<stdlib.h>
#include<stdio.h>
int main()
{
int x;
x = rand()%100;
printf("The Random Number is: %i", x);
return 0;
}
似乎总是将随机数打印为83.为什么会这样?
答案 0 :(得分:6)
大多数random number generators都是可重复的。您需要在使用之前为生成器播种,通常使用系统时间。
#include <time.h>
srand(time(NULL));
答案 1 :(得分:6)
强制性XKCD参考:
正如人们所说,你需要正确播种伪随机数生成器。
问题是,它仍然只生成 伪 随机数。大多数“真正的”随机数生成器需要访问random in nature的某些物理现象(例如,时钟偏差或温度波动)。
否则,XKCD参考并不是太远了。迪尔伯特也不是。
答案 2 :(得分:4)
因为 rand
使用的伪随机数生成器始终使用相同的种子进行初始化。
为了使用其他种子初始化它,您可以使用 srand
功能,并将其初始化为srand(time(NULL))
。
答案 3 :(得分:3)
因为83是随机数,不是吗?
更严重的是,让程序提供可重复的行为是很有用的,所以默认情况下,如果不更改种子,rand总是返回相同的数字序列。
答案 4 :(得分:1)
通过包含<time.h>
并致电srand(time(0));
来种子随机数生成器(感谢我的评论者编辑)
答案 5 :(得分:0)
除非您的随机数生成器能够访问彼得先前引用的真正随机物理现象,否则您无法生成一个真正随机的随机数。但是对于一般用途,您可以使用C的标准库函数来生成随机数。以下是在两个限制(最大值和最小值)之间生成随机数的示例代码:
#include<stdio.h>
#include<stdlib.h>
#define MIN 1
#define MAX 5
#define QUANTITY 5
int main()
{
int i;
//stores the time in seconds
time_t seconds;
//getting the system time
time(&seconds);
//initializing the random generator with system time
//as the seed value
srand((long)seconds);
for(i = 0; i < QUANTITY; i++)
{
printf("%f\t",((float)rand())/RAND_MAX*(MAX-MIN)+MIN);
}
printf("\n");
return 0;
}