• 关于随机数问题


          我们知道,在C语言中获取随机数采用的是rand(),但是同时我们也知道这只是产生一个伪随机数。要获取真实的随机数,很多情况下我们要添加一个种子srand(seed),但是种子的生成一般采用当前的系统时间,在C语言中time(NULL);但是在循环产生随机数又放回的过程中,我们可能要多次采用系统时间重新作为时间种子,如果计算速度较快的情况下,两次的种子可能会是一样,这种情况下,随机数也会成为伪随机数。例如 如下一段代码:

     int a[21]={0};

        NSLog(@"Before Rand");

        for (int i=0; i<21; i++) {

            NSLog(@"%i  count = %i",i,a[i]);

        }

        

        for (int i=0; i<INT32_MAX/10; i++) {

            time_t t=time(NULL);

            srand(t);

            //t=random()%t;        

            //srand(t);        

            int r = rand()%20;        

            a[r]++;

        }

        

        NSLog(@"************After Rand count =%i",INT32_MAX/10);

        

        for (int j=0; j<21; j++) {

            NSLog(@"%i  count = %i 比例:%f",j,a[j],a[j]*1.0/(INT32_MAX/10));

        }

    输出的结果:   

    2012-06-08 20:10:19.191 LotteryForecast[1357:fb03] ************After Rand count =214748364

    2012-06-08 20:10:19.192 LotteryForecast[1357:fb03] 0  count = 8714204 比例:0.040579

    2012-06-08 20:10:19.192 LotteryForecast[1357:fb03] 1  count = 8870863 比例:0.041308

    2012-06-08 20:10:19.193 LotteryForecast[1357:fb03] 2  count = 8819777 比例:0.041070

    2012-06-08 20:10:19.194 LotteryForecast[1357:fb03] 3  count = 8865596 比例:0.041284

    2012-06-08 20:10:19.194 LotteryForecast[1357:fb03] 4  count = 13288615 比例:0.061880

    2012-06-08 20:10:19.195 LotteryForecast[1357:fb03] 5  count = 13306079 比例:0.061961

    2012-06-08 20:10:19.196 LotteryForecast[1357:fb03] 6  count = 13304991 比例:0.061956

    2012-06-08 20:10:19.196 LotteryForecast[1357:fb03] 7  count = 8796270 比例:0.040961

    2012-06-08 20:10:19.197 LotteryForecast[1357:fb03] 8  count = 8871066 比例:0.041309

    2012-06-08 20:10:19.198 LotteryForecast[1357:fb03] 9  count = 8871216 比例:0.041310

    2012-06-08 20:10:19.198 LotteryForecast[1357:fb03] 10  count = 10324577 比例:0.048078

    2012-06-08 20:10:19.199 LotteryForecast[1357:fb03] 11  count = 13305199 比例:0.061957

    2012-06-08 20:10:19.200 LotteryForecast[1357:fb03] 12  count = 13306399 比例:0.061963

    2012-06-08 20:10:19.200 LotteryForecast[1357:fb03] 13  count = 9720417 比例:0.045264

    2012-06-08 20:10:19.201 LotteryForecast[1357:fb03] 14  count = 8854832 比例:0.041234

    2012-06-08 20:10:19.202 LotteryForecast[1357:fb03] 15  count = 8870799 比例:0.041308

    2012-06-08 20:10:19.202 LotteryForecast[1357:fb03] 16  count = 8869531 比例:0.041302

    2012-06-08 20:10:19.203 LotteryForecast[1357:fb03] 17  count = 13186803 比例:0.061406

    2012-06-08 20:10:19.203 LotteryForecast[1357:fb03] 18  count = 13296187 比例:0.061915

    2012-06-08 20:10:19.204 LotteryForecast[1357:fb03] 19  count = 13304943 比例:0.061956

    代码是在Xcode中用Objective-C 所写。INT32_MAX 是其定义的宏=2147483647,由于这个计算量比较大,所以除以10,大约有2亿多次,我觉得计算个数也足够大了。根据随机数概念的0-19中每个数的所占的比例应该是接近0.05,但是,算出来的结果相差比较大。

    我们把注释的

            //t=random()%t;        

            //srand(t);    两行代码取消注释,得到的结果是:

    2012-06-08 20:02:10.397 LotteryForecast[1315:fb03] ************After Rand count =214748364

    2012-06-08 20:02:10.398 LotteryForecast[1315:fb03] 0  count = 10738013 比例:0.050003

    2012-06-08 20:02:10.399 LotteryForecast[1315:fb03] 1  count = 10733722 比例:0.049983

    2012-06-08 20:02:10.401 LotteryForecast[1315:fb03] 2  count = 10734305 比例:0.049986

    2012-06-08 20:02:10.402 LotteryForecast[1315:fb03] 3  count = 10739804 比例:0.050011

    2012-06-08 20:02:10.403 LotteryForecast[1315:fb03] 4  count = 10739393 比例:0.050009

    2012-06-08 20:02:10.403 LotteryForecast[1315:fb03] 5  count = 10737903 比例:0.050002

    2012-06-08 20:02:10.404 LotteryForecast[1315:fb03] 6  count = 10738244 比例:0.050004

    2012-06-08 20:02:10.405 LotteryForecast[1315:fb03] 7  count = 10739582 比例:0.050010

    2012-06-08 20:02:10.405 LotteryForecast[1315:fb03] 8  count = 10735811 比例:0.049993

    2012-06-08 20:02:10.406 LotteryForecast[1315:fb03] 9  count = 10733378 比例:0.049981

    2012-06-08 20:02:10.407 LotteryForecast[1315:fb03] 10  count = 10736438 比例:0.049995

    2012-06-08 20:02:10.407 LotteryForecast[1315:fb03] 11  count = 10735810 比例:0.049993

    2012-06-08 20:02:10.408 LotteryForecast[1315:fb03] 12  count = 10740495 比例:0.050014

    2012-06-08 20:02:10.408 LotteryForecast[1315:fb03] 13  count = 10741913 比例:0.050021

    2012-06-08 20:02:10.409 LotteryForecast[1315:fb03] 14  count = 10733788 比例:0.049983

    2012-06-08 20:02:10.410 LotteryForecast[1315:fb03] 15  count = 10738327 比例:0.050004

    2012-06-08 20:02:10.410 LotteryForecast[1315:fb03] 16  count = 10736170 比例:0.049994

    2012-06-08 20:02:10.411 LotteryForecast[1315:fb03] 17  count = 10739613 比例:0.050010

    2012-06-08 20:02:10.412 LotteryForecast[1315:fb03] 18  count = 10738359 比例:0.050004

    2012-06-08 20:02:10.412 LotteryForecast[1315:fb03] 19  count = 10737296 比例:0.049999


    0-19每个数都非常接近0.05,可以看到这个随机数比较的准确。问题就出现在我们所采用的随机种子中,我们第一次把时间当作时间种子,随机出一个数,再把这个数当作随机种子进行随机,可以得到更接近随机的数。由于我们种子是随机产生的。

     

  • 相关阅读:
    02-MySQL的安装和管理
    01-pymysql模块的安装
    异常处理
    USACO 2015 Feb Censoring
    玄武密码(bzoj4327)(JSOI2012)
    浅谈AC自动机
    Equation
    JOI五子棋
    浅谈Tarjan
    年轮蛋糕JOI2014Final
  • 原文地址:https://www.cnblogs.com/qboy/p/2542326.html
Copyright © 2020-2023  润新知