关于随机数问题

      我们知道,在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,可以看到这个随机数比较的准确。问题就出现在我们所采用的随机种子中,我们第一次把时间当作时间种子,随机出一个数,再把这个数当作随机种子进行随机,可以得到更接近随机的数。由于我们种子是随机产生的。

 

原文地址:https://www.cnblogs.com/qboy/p/2542326.html