• 締切済み

サイコロの合計値

サイコロで各目が等確率で出るとして、合計値が10000になるまでの回数(確率)を求たいのですが、Javaのサンプルコードをいただけませんでしょうか?

  • Java
  • 回答数9
  • ありがとう数1

みんなの回答

  • KSOH
  • ベストアンサー率93% (29/31)
回答No.9

先の私の回答で「合計がちょうどN」になる確率はすごく小さくなると思うと書きましたが 間違いですね。失礼しました!正しくはtitokaniさんがおっしゃる通りの値に収束すると 思います。 蛇足: ちょうどNになる確率を求めるアルゴリズムとしてtitokaniさんの再帰アルゴリズムが 直感的にわかりやすいですね! N=10000のときにメモリー不足になったとのことですが、Nが大きくなると再帰呼び出し の深さもN相当になるため、メソッド呼び出しのためのスタックがオーバーフロー したのではないでしょうか。 Nにいきなりおおきな値が指定されてもスタックオーバーフローしないように 配慮するには(あまりきれいじゃないですが)titokaniさんのプログラムのfuncを 小さい値から順に何度も呼び出すという方法が考えられます。こうして funcを直接呼び出すのではなく下記のprobabilityJustMatchを呼び出すように すればfuncの再帰呼び出しの深さが2以上になることもなく、HashMapがパンク しない限り与えられた値に概ね比例する計算時間(&消費メモリー)で結果が得られます。 static double probabilityJustMatch(int n) {  for (int i = 1; i < n - 1; i++) {   func(i); //return値は無視。func(1)~func(n-1)までの解をmapへ登録するのが目的  }  return func(n); }

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.8

#7です。 ごめんなさい。1/2じゃないですね。 およそ0.2857・・くらいに収束するようです。 まともに計算するとえらい時間がかかるので、mapでキャッシュにしたのですが、10000だとメモリが足りないようです。 private static Map<Integer,Double> map=new HashMap<Integer, Double>(); public static double func(int n) { if( n < 0 )return 0; if( n == 0 )return 1; if( map.containsKey(n) ){ return map.get(n); } double r=func(n-1)/6+func(n-2)/6+func(n-3)/6+func(n-4)/6+func(n-5)/6+func(n-6)/6; map.put(n, r); return r; }

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.7

ぴったり10000になる確率ですが、およそ1/2ではないでしょうか? 再帰を使えば求めれそうな気がします。 double func(int n) { if( n < 0 )return 0; if( n == 0 )return 1; return func(n-1)/6+func(n-2)/6+func(n-3)/6+func(n-4)/6+func(n-5)/6+func(n-6)/6; } とか。

  • KSOH
  • ベストアンサー率93% (29/31)
回答No.6

すみません、自分の回答のプログラムに1行抜けがあります。プログラムの先頭に以下のimport文が必要です。おわかりかも知れませんが・・・ import java.util.Arrays;

  • KSOH
  • ベストアンサー率93% (29/31)
回答No.5

文面を読む限りちょうど10000になるという条件ではなく、10000に到達するまでに何回サイコロを振らなければならないかの回数の期待値が求めたいと思えました。合計値がちょうど10000になる確率だとすると浮動小数の精度限界を超えるぐらい小さな確率になってしまいそうです。 そう仮定しますと次のようなプログラムで理論値を計算できると思います。expectedRollsメソッドの引数に到達目標の目の合計(今回なら10000)を渡すと期待値が返ってくるというものです。実際に10000での回数の期待値を計算してみると2857.619048という値でした。 なお、到達するのに必要な回数ごとに確率を求めたいなら  expectedRollOfReach += roll * reachedProbability; の行の直後に以下の行を挿入すれば表示できます。  System.out.format(" probability %f for %d rolls\n", reachedProbability, roll); --以下がプログラム-- public class DiceSolver {  static final int MIN_DICE = 1;  static final int MAX_DICE = 6;  static final double PROBABILITY_PER_ROLL = 1D / (MAX_DICE - MIN_DICE + 1);  public static double expectedRolls(int totalSum) {   if (totalSum < 0)    throw new IllegalArgumentException("total summation should be non negative!");   double[][] probabilities = new double[2][totalSum + MAX_DICE];   int curIndex = 0;   probabilities[curIndex][0] = 1D;   int minSum = 0;   int maxSum = 0;   double expectedRollOfReach = 0D;   int maxRoll = (totalSum + MIN_DICE - 1) / MIN_DICE;   for (int roll = 1; roll <= maxRoll; roll++, curIndex = 1 - curIndex) {    double[] cur = probabilities[curIndex];    double[] next = probabilities[1 - curIndex];    Arrays.fill(next, 0D);    for (int sum = minSum; sum <= maxSum; sum++) {     for (int dice = MIN_DICE; dice <= MAX_DICE; dice++) {      next[sum + dice] += cur[sum] * PROBABILITY_PER_ROLL;     }    }    minSum = minSum + MIN_DICE;    maxSum = maxSum + MAX_DICE;    if (maxSum >= totalSum) {     double reachedProbability = 0D;     for (int sum = totalSum; sum <= maxSum; sum++) {      reachedProbability += next[sum];     }     expectedRollOfReach += roll * reachedProbability;     maxSum = totalSum - 1;    }   }   return expectedRollOfReach;  } }

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.4

>ぴったり10000になる確率なら、0ですね。 これは極論過ぎます。 確率が0ということはその事象は「絶対に起こらない」ということですが、 実際には、何回かプログラムを実行すれば、そのうち何回かは 合計値がちょうど10000になることもあるでしょう。 何回チャレンジすればよいかまではわかりませんが。

回答No.3

Javaはスピードが遅いので下記プログラムでは合計値を100とし、50回繰り返した場合の確立を計算しています。 import java.util.Random; public class test { public static void main(String[] args) { int expectation = 100; int loop = 50; int shake; int dice; int total; int match = 0; double probability; Random rd = new Random(); for(int i=0;i<loop;i++){ total = 0; shake=0; do{ shake++; dice = rd.nextInt(6)+1; total = total+dice; }while(total<expectation); if(total==expectation){ match++; System.out.print("match:"); } System.out.println("total="+total); System.out.println("shake="+shake); } System.out.println("match="+match); probability = (double)match/loop*100; System.out.println("確率="+probability+"%"); } }

回答No.2

単純に考えるとサイコロを振る回数の平均値は 10000/3.5=2857.1428571428571428571428571429

  • maiko0333
  • ベストアンサー率19% (840/4403)
回答No.1

合計はぴったり10000なの? ぴったり10000になる確率なら、0ですね。

関連するQ&A

  • サイコロ、確率

    さいころが4個あります。一度に4個全てを同時に振ります。 さいころの目が合計23以上になる確率。 さいころの目が合計22以上になる確率。 それぞれ解説を踏まえて教えて頂きたいです。 よろしくお願いします。

  • 確率の問題です。3個の正六面体のさいころをふるとき、3個のさいころの出

    確率の問題です。3個の正六面体のさいころをふるとき、3個のさいころの出る目の数の和が15であるという事象をAで表すことにする。このとき次の確率変数の確率分布の名称と平均を答えよ。 (1)3個のさいころをふることをAが初めて起こるまで繰り返すときの回数 (2)3個のさいころをふることを270回くりかえすときAが起こる回数 (3)3個のさいころをふることをAが5度起こるまで繰り返すときの回数  分かる方いらっしゃったら回答お願いします。

  • 2個のサイコロの合計の確率分布は「正規分布」(の近似)と呼べるのでしょうか?

    2個のサイコロの合計の確率分布は 2:1/36,3:2/36,4:3/36,5:4/36,6:5/36,7:6/36, 8:5/36,9:4/36,10:3/36,11:2/36,12:1/36 となると思います。 これを、X軸に合計の値、Y軸に確率を取る形でグラフ化した場合、このグラフは正規分布している(に近い)グラフと呼べるのでしょうか? いろいろ調べると、サイコロの数をふった回数だけではなく、サイコロの数自体をもっともっと増やさないと、正規分布(の近似)と呼ぶことはできないのが結論のような気がするのですが、今ひとつ理解できません。 どなたか教えてください。よろしくお願いします。

  • 【数学】サイコロを4つ振ったときの合計値【確率】

    サイコロを4つ振り、2つずつ合計すると2~12の数になります。 それぞれの数となる確率を求めるにはどうすればよいでしょうか。 よろしくお願いします。

  • 4つのサイコロから2つを取り出した確率

    4つのサイコロを同時に振ります。 出た目から2つを選び、2つの目の合計が7の確率を求めよ。 という場合の確率計算が全然わかりません。どう計算するのでしょうか?

  • 6個のさいころの目の合計値が出る確率

    1~6までの普通のサイコロを振り 13から27までの合計値が出る確率を それぞれの値において求めたいのですが 方法を教えていただけないでしょうか?

  • サイコロ 同じ目がr回出る確率

    サイコロ(1/6)の同じ目が4回連続で出る確率と、同じサイコロの3の出る回数が4回連続で出る確率が違うのはなぜでしょうか? よろしくお願いします。

  • サイコロを5つ振って、合計10が出る確率の計算方法を教えてください!

    サイコロを5つ振って、合計10が出る確率の計算方法を教えてください! ツリーを書いて地道に数える方法しかないでしょうか。。。。

  • サイコロとコインの分布

    次の確率の問題がわかりません (2を特にお願いします) 表が出る確率をpのコインとサイコロを用意する。 コインとサイコロを交互に投げる。この試行を サイコロの3の目が出るまで続けるとする。 以下の問題に答えよ 1.コインの投げる回数をYとするとき、 Yの確率分布と平均を求めよ 2.コインのおもてが出た回数をXとするとき、 X=1、X=2となる確率をそれぞれ求めよ 1については幾何分布だから 分布は1-(1-p)^(Y) 平均は(1-p)/p ですよね? 2については、サイコロの3が出ない場合が続いたら その確率はどうなるのかがわかりません

  • サイコロ確率(その2)

    この確率の問題の「模範的解法」をお願いします。 3個のサイコロを同時に振る (A.3個のうちいずれか2個のサイコロの目の和が5になる確率を求めよ)質問済み B.3個のうちいずれか2個のサイコロの目の和が10になる確率を求めよ C.どの2個のサイコロの目の和も5の倍数でない確率を求めよ 以下私の(非効率な)方法です B 1個目が6、2個目が6、3個目が4の確率:(1/6)(1/6)(1/6)=1/216 1個目が6、2個目が5、3個目が4又は5の確率:(1/6)(1/6)(2/6)=2/216 1個目が6、2個目が4、3個目はなんでもよい確率:(1/6)(1/6)(6/6)=6/216 1個目が6、2個目が1、2、3、のどれか、3個目が4の確率:(1/6)(3/6)(1/6)=3/216 以上を加えて1個目が6の場合は 12/216 1個目が5、2個目が6、3個目が4又は5の確率:(1/6)(1/6)(2/6)=2/216 1個目が5、2個目が5、3個目はなんでもよい確率:(1/6)(1/6)(6/6)=6/216 1個目が5、2個目が4、3個目が5又は6の確率:(1/6)(1/6)(2/6)=2/216 1個目が5、2個目が1、2、3、のどれか、3個目が5の確率:(1/6)(3/6)(1/6)=3/216 以上を加えて1個目が5の場合は 13/216 1個目が4の場合は6と同じで 12/216 1個目が1,2,3のどれかで、2個目が4又は5又は6、3個目が2個目とマッチングして和が10になる確率:(3/6)(3/6)(1/6)=9/216 以上を加えて答え:23/108 C 3個のサイコロの2個の目の和が5にも10にもなるのは1,4,6の組み合わせのときだけだから、この順列3!通りの出かたがある。 どれか2個の目の和が5の倍数となる確率は: (5/18)+(23/108)-(3!/216)=25/54 よってどの2個のサイコロの目の和も5の倍数でない確率: 1-(25/54)=29/54