系統所提供的亂數,不合預期
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));
}