ランダムな数字を取り出すのには、Randomクラスを使う。
Random (Java Platform SE 6)
http://docs.oracle.com/javase/6/docs/api/java/util/Random.html
たとえば、サイコロのアプリケーションを考えた時、1~6の整数の間でランダムな数字を取り出したい、ってことがあると思う。
ふと思ったのだけれど、その時にRandomクラスをどう使えば、できるだけ結果が平等になるんだろうか。
500回振ったとして、アプリケーションの作り方は次の考え方があると思う。
- 一回だけNewして、ランダム値を500回取る。
- 500回Newして、ランダム値を取る。
インスタンスの生成と破棄を考えたら、まぁ前者で作るんだけど、それでいいのかしらん?
と考え込んでしまったので、サンプルアプリを書いてみた。
1: /**
2: * サイコロサンプルアプリ
3: * @author esten
4: *
5: */
6: public class RandomTests {
7: // 6面ダイスを count 回振ってみる
8: static int dice = 6;
9: static int count = 500;
10: /**
11: * 結果を画面に表示する
12: * @param rolled
13: */
14: private static void print(int[] rolled){
15: final String formatString = "dice %d = (%4d) %s \n";
16: DecimalFormat df = new DecimalFormat("#0.00%");
17: for (int i = 0 ; i < dice ; i++){
18: System.out.printf(formatString, i, rolled[i], df.format((double) rolled[i] / count));
19: }
20: }
21: /**
22: * @param args
23: */
24: public static void main(String[] args) {
25: int[] rolled = new int[dice];
26: // ランダム一回パターン
27: Random rnd = new Random();
28: for (int i = 0 ; i < count ; i++){
29: rolled[rnd.nextInt(dice)] += 1;
30: }
31: System.out.println("One New");
32: print(rolled);
33: System.out.println("---");
34: // ランダムnewパターン
35: rolled = new int[dice];
36: for (int i = 0 ; i < count ; i++){
37: rnd = new Random();
38: rolled[rnd.nextInt(dice)] += 1;
39: }
40: System.out.println("New in loop");
41: print(rolled);
42: System.out.println("---");
43: }
44: }
で、実行してみた結果。まぁ、何回かやってみるわけだけど。
One New
dice 0 = ( 86) 17.20%
dice 1 = ( 86) 17.20%
dice 2 = ( 84) 16.80%
dice 3 = ( 83) 16.60%
dice 4 = ( 84) 16.80%
dice 5 = ( 77) 15.40%
---
New in loop
dice 0 = ( 77) 15.40%
dice 1 = ( 70) 14.00%
dice 2 = ( 91) 18.20%
dice 3 = ( 93) 18.60%
dice 4 = ( 88) 17.60%
dice 5 = ( 81) 16.20%
---
うーん、差は大きなものではない感じ。どっちでもいいのかな? サンプル回数を増やしてみよう。count = 50000で^^;
One New
dice 0 = (8380) 16.76%
dice 1 = (8444) 16.89%
dice 2 = (8222) 16.44%
dice 3 = (8287) 16.57%
dice 4 = (8282) 16.56%
dice 5 = (8385) 16.77%
---
New in loop
dice 0 = (8304) 16.61%
dice 1 = (8309) 16.62%
dice 2 = (8402) 16.80%
dice 3 = (8391) 16.78%
dice 4 = (8259) 16.52%
dice 5 = (8335) 16.67%
---
あんまり差が出ない。でも、処理時間が後者だと目に見えて遅いのが判った。ってことは、前者の方法で良さげ。納得して使おう。