c语言随机数rand函数一探究竟
rand函数是C语言用来产生随机数的函数,一般搭配srand函数使用。使用方法如下:
#include <stdio.h>
#include <time.h>
void main()
{
srand((unsigned)time(NULL));//设置当前时间为种子
printf("%d",rand()%10);//生成0-9的随机数
}
rand()函数会随机产生一个0-RAND_MAX1的数值。那么为什么还需要srand函数呢?我只需要一句rand()%10就可以产生0-9的随机数了不是吗?这是因为由rand函数生成的随机数是伪随机数(pseudo-random)。即不是真的随机数。
真正的随机数?
之所以使用srand函数是为了设置时间种子。那么什么是时间种子呢?时间种子本身只是一个数字,rand函数产生的随机值就是由这个数字带入一个特殊函数得来的。而这个数字是计算机启动之后就确定的了。因为特殊函数是确定的现在数字又是确定的,就会导致rand函数产生的随机值并不是真正意义上的随机,一般称作伪随机。那么srand的作用也就非常明显了,srand接收一个数字并且把这个数字设置为随机种子。那么这个参数设置为多少才能达到真正的随机呢?答案就是时间。
程序运行的开始时间是由程序员控制的,解决了伪随机的问题。
测试srand对rand的影响。
测试不使用srand函数的结果。不使用srand函数会导致每次调用rand函数时都使用了同一个随机种子。结果如何呢?测试代码如下:
#include <stdio.h>
#include <time.h>
void main()
{
//srand((unsigned)time(NULL));//设置当前时间为种子
int num[10];//num数组对随机数结果计数
for(int k=0;k<10;k++){
memset(num,0,10*sizeof(int));
printf("第%d次结果\n",k);
for(int i=0;i<10000;i++){
int myNum=rand()%10; //生成0-9的随机数
num[myNum]++;//累计结果
}
for(int i=0;i<10;i++){
printf("%d\n",num[i]);//输出结果
}
}
}
这是真的吗?
结论
未发现明显证据证明rand函数不具有随机性。
这个是为什么?
怀疑对象为处理随机种子的特殊函数。例如:
特殊函数的随机性以50000为周期,在50000以内数字是随机的,下一个50000的随机值和第一个50000的随机值一样。那么我这个实验是证明不了rand函数是否具有随机性的。
https://www.tutorialspoint.com/c_standard_library/c_function_rand.htm ↩︎