验证Math.random()函数产生的是均匀分布的数值

思想:

Math.random()产生50000(MAX尽量多)个随机数,都将之转换为0---99(n=100)内的整数,然后查看分别查看1,2,3.。。。。99的每个数的个数是多少,是否接近 "MAX/n" 个即可。

代码:

 

 

 1 public class randomR
 2 {    
 3     /**
 4      * 验证Math.random()函数产生的是均匀分布的数值
 5      * @param MAX  产生多少个随机数,越多越好,越多的话数值表现的越明显
 6      * @param n    产生的随即数是在0--n之间的整数的个数,n值最好取值为100,这里以100为例
 7      * @return     数组,存放了从0--n之间的每个整数的个数,用来分析用的。
 8      */
 9        public static int[] isRandom(int MAX,int n)
10     {
11         int[] list = new int[n];  //存储数值的
12         for(int k = 0 ; k < n; k++)
13             list[k]=0;
14         
15         for(int i = 0 ; i < MAX ; i++)
16         {
17             double d = n * Math.random();  //  0.0 < d < 100.0
18             d = Math.floor(d);            //  0.0 <= d <=99.0
19             long l = Math.round(d);       //    0 <  l  < 99
20             int j = (int)l;               //    0 <  j  < 99
21             ++list[j];                    //重要地方,用数组统计个数    
22         }
23        return list;
24     }
25 
26         // 打印函数
27     public static void print(int b[])
28     {
29          for(int i=0; i<b.length ; i++)
30          {
31             System.out.print(b[i] + (i%10 ==9 ? "\n":"\t"));  //每行打印10个,每个字符之间一个制表符的距离
32          }
33     }
34 
35         //主函数
36         public static void main(String args[])
37         {
38                 int a[] = isRandom(50000,100); 
39                 print(a);
40         }
41 }
42 

 

输出结果:

 

 

 1 521    494    511    495    473    493    508    514    498    466
 2 513    504    507    492    471    440    483    500    480    489
 3 472    509    508    498    471    489    514    536    489    501
 4 513    515    509    424    484    511    475    517    530    530
 5 515    468    505    545    546    480    513    500    511    476
 6 517    489    498    477    481    525    487    498    513    533
 7 480    526    570    494    480    479    472    536    463    507
 8 519    529    496    521    487    491    540    485    511    514
 9 523    444    510    528    494    488    544    505    526    503
10 499    500    464    486    513    461    505    478    494    511

 

 

从结果中我们可以看出,每一个数都接近50000/100=500,这就证明了Math.random()函数确实产生了均匀分布的随即数。这个问题我们应该掌握两点:

1.解决问题的思想

2.数组在这个问题中的重要作用

posted @ 2010-04-13 09:43  纯粹的郭子  阅读(2945)  评论(2编辑  收藏