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函数是否具有随机性的。


  1. https://www.tutorialspoint.com/c_standard_library/c_function_rand.htm ↩︎

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值