以下是一段代码示例:
#include<stdlib.h>
#include<stdio.h>
int main()
{
int x;
x = rand()%100;
printf("The Random Number is: %i", x);
return 0;
}
它似乎总是将随机数打印为83。为什么会这样?
大多数随机数生成器都是可重复的。在使用之前,您需要为生成器提供种子,通常使用系统时间来完成。
#include <time.h>
srand(time(NULL));
time()
的精度范围内)。 - Sklivvz必须引用 XKCD 段子:
rand
使用的伪随机数生成器始终使用相同的种子进行初始化。srand
函数,并将其初始化为例如 srand(time(NULL))
。因为83是一个随机数,不是吗?
更严肃地说,拥有提供可重复行为的程序非常有用,因此如果您不更改种子,则rand始终返回相同的数字序列。
<time.h>
并调用 srand(time(0));
来初始化随机数生成器(感谢我的评论者提供的意见)。time_t
保证是算术类型,因此它将被转换为正确的类型。(如果time_t
允许是其他类型,则强制转换将无效,因此无论如何都是无用的。) - Gilles 'SO- stop being evil'time_t
允许是浮点类型,并且当前时间的值可能太大而无法适合 unsigned int
中。因此,正如Gilles所说,编译器在强制转换时抑制的任何警告可能实际上正在告诉您某些理论上重要的事情,例如,您的代码将在某个期限停止工作。不可否认,在Unix纪元和32位int中,该截止日期为2106年,因此可能没有太多实际利益... - Steve Jessop除非你的随机数生成器可以访问彼得早期引用的真正随机物理现象,否则无法生成真正随机的随机数。但是,对于一般用途,您可以使用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;
}
rand
的实现非常糟糕,甚至在简单的模拟中都会崩溃。 - CodesInChaos