为什么这个数字不是随机的?

时间:2011-04-30 13:01:58

标签: c random

对于以下代码:

#include<stdlib.h>
#include<stdio.h>

int main()
{
    int x;
    x = rand()%100;
    printf("The Random Number is: %i", x);

return 0;
}

似乎总是将随机数打印为83.为什么会这样?

6 个答案:

答案 0 :(得分:6)

大多数random number generators都是可重复的。您需要在使用之前为生成器播种,通常使用系统时间。

#include <time.h>
srand(time(NULL));

答案 1 :(得分:6)

强制性XKCD参考:

enter image description here

正如人们所说,你需要正确播种随机数生成器。

问题是,它仍然只生成 随机数。大多数“真正的”随机数生成器需要访问random in nature的某些物理现象(例如,时钟偏差或温度波动)。

否则,XKCD参考并不是太远了。迪尔伯特也不是。

enter image description here

答案 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;
}