知識社群登入
系統所提供的亂數,不合預期
by 高顯忠, 2010-11-15 12:00, 人氣(1587)
#if 0

理想中的亂數是,

一 要儘可能的產生比較長的週期,
也就是說,在出現相同的數字之前,
所產生的 所有數字的 個數

二 每一個數字的出現頻率要相同,
所以,週期要 固定

三 產生的速度要 儘可能的快

s1=  20826, s2=  20826, ct=   40354
s1=  20829, s2=  20829, ct=   32390
s1=  20833, s2=  20833, ct=    9846
s1=  20836, s2=  20836, ct=   47585
s1=  20839, s2=  20839, ct=    7268
s1=  20842, s2=  20842, ct=   24388
s1=  20846, s2=  20846, ct=    1273
s1=  20849, s2=  20849, ct=   21765
s1=  20852, s2=  20852, ct=   17792
s1=  20856, s2=  20856, ct=   24732
s1=  20859, s2=  20859, ct=   45344
s1=  20862, s2=  20862, ct=   96963
s1=  20865, s2=  20865, ct=   27246
s1=  20869, s2=  20869, ct=   28311
s1=  20872, s2=  20872, ct=   32888
s1=  20875, s2=  20875, ct=    8121
s1=  20878, s2=  20878, ct=   42342
s1=  20882, s2=  20882, ct=   31186
s1=  20885, s2=  20885, ct=   66311
s1=  20888, s2=  20888, ct=   68819
s1=  20891, s2=  20891, ct=    6028
s1=  20895, s2=  20895, ct=   25150
s1=  20898, s2=  20898, ct=   18894
s1=  20901, s2=  20901, ct=   43998

以上,一共跑了 180趟,平均值 接近 32768,
符合預期。

但是,週期的變化,min= 99, max= 18萬多,
不合規定,而且也是顯得 週期太短。

min=       99, max= 184309, ave.= 30662.267
Press any key to continue

#endif
// ----------------------------------------------

#include <stdlib.h>
#include <stdio.h>
#include <time.h>

void main( void )
{
int i, ct, s1, s2, t1, t2, sum= 0;
int min, max;
min= 2000000000;
max= -min;
for (i=1;i<=(60*3);i++) {// do the 10- times
t1= time(NULL);
t2= time(NULL);
while (t2 == t1) {
t2= time(NULL);
}
srand(t2);
ct= 0;
s1= rand();
s2= rand();

// s2 <> s1
while (s2 != s1) {
s2= rand();
ct++;
}
printf("s1= %6d, s2= %6d, ct= %7d\n", s1, s2, ct);
if (min > ct) min= ct;
if (max < ct) max= ct;
sum+= ct;
}
printf("\n\n min= %8d, max= %5d, ave.= %.3lf\n", min, max, sum/(60.0*3));
}