演習(モンテカルロ法)の回答例

出典: CourseWiki

編集の都合でクラス名が OrderedProbability1 になっていますが気にしないでください.

0001:/*
0002: * 乱数で作った配列が昇順に並ぶ確率を調べるプログラム
0003: */
0004:public class OrderedProbability1 {
0005:    public static void main(String[] args) {
0006:        int n = 4;
0007:        int ntrial= 100000;        // 試行の回数
0008:        int nordered = 0;        // 昇順になっていた回数
0009:        // ntrial回試行する
0010:        for (int i = 0; i < ntrial; i++) {
0011:            // 大きさnの配列に乱数で0から1までの値を代入
0012:            double[] data = new double[n];
0013:            for (int j = 0; j < data.length; j++) {
0014:                data[j] = Math.random();
0015:            }
0016:            // 配列の先頭から,昇順に並んでいるかチェック
0017:            boolean ordered = true;        // とりあえず昇順に並んでいるものとする
0018:            for (int j = 0; j < data.length - 1; j++) {
0019:                if (data[j] > data[j+1]) {
0020:                    // 昇順になっていない場所を発見した場合
0021:                    ordered = false;
0022:                    break;
0023:                }
0024:            }
0025:            // 昇順になっていたら nordered の値を +1
0026:            if (ordered) {
0027:                //System.out.println(java.util.Arrays.toString(data));
0028:                nordered++;
0029:            }
0030:        }
0031:        System.out.println("昇順になった回数: " + nordered);
0032:        System.out.println("昇順になる確率は " + (double)nordered / ntrial);
0033:    }
0034:}
0035:
  • 19行目のif文で隣り合う2つの要素を比較し,昇順かどうかをチェックしています.
  • 19行目では配列のj番目とj+1番目を使っているので,18行目のfor文ではjが最後の要素の一つ手前までしか

動かないように -1 しています.

解析的な考え方

n個の数の並べ方はn! (nの階乗) 通りあって,その中の1通りだけが昇順になっているはず(値は重複しないものとした場合). なので,確率は \frac{1}{n!} になります.

ナビゲーション