验证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
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
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.数组在这个问题中的重要作用