Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

乱数について

このようなクラスを作ったのですが上手くいきません。
具体的には引数で3(=3%)を指定しても10%くらいの確率
でtrueが返ってきます。
これはメソッドの作りが悪いのでしょうか?それとも運の
問題でしょうか?

/**
 * 指定した確率でtrueが返ってきます
 */
public class Probability {
    /**
     * 指定した確率でtrueが返ってきます
     * @param pa 確率
     * @return 真偽値
     */
    public static boolean probability(int pa){
        if(pa>=100){
            return true;
        }else if(pa<=0){
            return false;
        }else{
            int r = new 
java.util.Random().nextInt(100);
            return r<=pa-1;
        }
    }
}

2

回答

7062

閲覧

2件の回答

評価

0

ちゃんと機能しているようですね。

public class Test {
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder();
        int[] counter = new int[101];
        for (int i = 0; i <= 100; i++) {
            for (int j = 0; j < 100000; j++) {
                if (Probability.probability(i)) {
                    counter[i]++;
                }
            }
            sb.append(i).append(":").append(counter[i]).append("\n");
        }
        System.out.println(sb);
    }
}

評価

0

若干質問の内容とずれるかも知れませんがコメントしま
す。

コンピューターで乱数を生成する際、通常は乱数生成用の
同一のインスタンス(JREではjava.util.Randomのインスタ
ンス)を用いるのが普通の方法だと思います。

import java.util.Random;

public class Probability {
  private static Random random = new Random(); //(A)

  public static boolean probability(int pa) {
    ...
    int r = random.nextInt(100);
    ...
  }
}


java.util.Randomの引数なしのコンストラクターは起動さ
れた時刻などに基づきインスタンスを生成する度に異なる
乱数列が生成されるようになっているので、質問者さんの
コードでも動作はすると思います。

ただ、上に示したようなコードにしておくと例えばアプリ
ケーション起動の度に同一の乱数列を生成するようにして
デバッグしたいといった場合に(A)の部分を以下のように
変えるだけでそれが可能となるという利点があります。

  private static int SEED = 12345;
  private static Random random = new Random(SEED);

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。