• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:このような問題の解決方法を教えてください。)

スロットの大雑把シュミレーター作成方法

このQ&Aのポイント
  • スロットの大雑把なシュミレーターをプログラミングで作成する方法を教えてください。
  • 毎回3枚のコインを使ってスロットを回し、払い戻しのコインを含めてコインがなくなるまでに平均34.512回回る問題を解決するアルゴリズムを教えてください。
  • また、役が揃う確率を考慮して、偏りのないように役を設定する方法も教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.4

最初の回答をしてから,すこし考え直したのでもう一度最初から書いてみます. 時刻 t におけるコインの枚数を c(t) とおきます.問題からこの関数 c が満たさなければならない条件がいくつかあります: (C1) コインは最初,50枚ある ⇒ c(0) = 50 (C2) 平均34.512回で終わる ⇒ c(34.512) = 2 ふたつめの条件は最初の回答に書いたものとは違います;スロットが出来なくなるのはコインが0枚になったときではなくて,はじめてコインが2枚以下になったときだからです. 各時刻 t において (コインの枚数) = (最初に持っていたコインの枚数) - (これまでにスロットに投入したコインの枚数) + (これまでに払い戻されたコインの枚数[の期待値]) が成り立ちます.役の出る確率を p, 払い戻されるコインの枚数を n とすれば c(t) = 50 - 3t + npt = 50 + (np - 3)t となります.これで条件(C1)は満たします.そこで n, p は条件(C2)から決めます: 50 + (np - 3)34.512 = c(34.512) = 2 ⇔ np = 3 + (2 - 50)/34.512 = 1157/719. さて問題にはこれ以上の情報はありません.したがって n, p は等式 (*) np = 1157/719 が成り立つ限りどんなものでもよいわけです.しかし n は自然数というキツイ条件がついているので,こちらから決めてそのあとに p を決定する方が賢明でしょう.もし n = 3 としたなら等式(*)より p = 1157/2157 となります. これで実験してみたところ終了まで平均34.5147098回であることが確かめられました.下のグラフはそのような推移の一例です[赤線が関数 c のグラフ,青い点が実際のコインの枚数]. ## ただ上の方法には問題点もあります.コインが増えてから減ることはあってもコインが(2枚以下に)減ってから増えることはありえません.この差を上の式では考慮していないために実際の値とは少しズレが生じてしまいます.

akaginoyama
質問者

お礼

度々恐れ入ります。 私にとっては意外と難しかったので質問して良かったです。 図も文章も解りやすく丁寧に教えて頂き感謝です。

その他の回答 (3)

回答No.3

まだ間違ってました. -- np = 3125/2157 ++ np = 3 - 3125/2157 あと実際にプログラムを100万回動かして平均を取ってみたら終わるまでに33.729568回かかりました.前の式はコインの枚数を直線と考えましたが実際の推移はそんなふうではないわけで,しかも手元に1, 2枚コインを残して終わる場合もあるためすこし小さい値が出てしまうようです.きっちりコントロールするにはこれじゃダメですね.ちょっと適当にいじってみると n = 4, p = 0.396 くらいが良い値を返しそうです.(同様に実験したところ平均34.4998033回で終了しました.)

akaginoyama
質問者

補足

度々お手数恐れ入ります。 1、2枚のコインを残して終わる。これは当然回転数少なくなりますね。 n = 4, p = 0.396 ありがとうございます。

回答No.2

失礼.間違いです. -- while coins > 0: ++ while coins >= 3:

回答No.1

時刻 t におけるコインの枚数を c(t) とおきます. 役はひとつでその確率 p は固定しているので,その払い戻しを n とすればコインの枚数は c(t) = 50 - 3t + npt としてよいでしょう.これは t に関する1次式です.初条件と終条件から c(0) = 50, c(34.512) = 0 なので,これを解いて np = 3125/2157 となります.確率と払い戻しは上を満たせばなんでもいいので適当に決めてください. サンプルとしてPythonで書いたコードも載せておきます.きっとこんな感じでいいんじゃないでしょうか?(インデントがうまく表示されませんが,常識的にわかるでしょう.) #!/usr/bin/env python from random import random if __name__ == "__main__": time = 0 coins = 50 while coins > 0: print time, coins time += 1 coins -= 3 if random() < 0.310245: coins += 4 print "GAMEOVER"

akaginoyama
質問者

お礼

回答ありがとうございます。 せっかく丁寧に教えて下さっているにごめんなさい。 1次式と初条件と終条件の関係の部分の式が理解できてません。 それと、 np = 3125/2157 から、なぜ、 0.310245: coins += 4 のような確率と払出しになるかも理解できてません。 でも、何となくこうでは無いかと言う想像から別の言語で コードを書いてみましたが、コインの払出し枚数が4枚ではうまく行きませんでした。 (5枚ならば、目的の34.512回に割りと近い結果の平均が得られるのですが) そもそも、理解が浅く私が勘違いしているのでは無いかと思います。 アルゴリズムの解答も得たいのですが数式が理解できて算数の勉強にもなればと思っています。 もし、よろしければもう一段階やさしいご指導頂けると助かります。 以下のコードはなでしこと言う言語ですが、 インデント必須なのでインデント壊れた場合に備えループに番号を打ってます。 //ここから データ=`` 結果とは配列。 永遠の間 //(1)のループ コイン=50 永遠の間 //(2)のループ  コインから3を直接引く   //なでしこのランダム値は整数なので整数変換してます。   (1000000の乱数<310245)ならばコインに4を直接足す。   (コイン<3)ならば、    回数を結果に配列追加    抜ける   //(2)のループここまで (結果の配列要素数=10000)ならば、抜ける //(1)のループここまで 結果を表示 結果の配列平均を言う//1万回の試行で34.512回に近づくか試しに出力 //こここまで

関連するQ&A

専門家に質問してみよう