前提・実現したいこと
結果がランダムに返ってくる関数のテスト方法を知りたい。
例えば、じゃんけんをするプログラムを書いた。
この関数は、1/3の確率でグーを返すはずだが、それをテストしたい。
import random def janken(): return random.choice(["グー", "チョキ", "パー"])
ただし、乱数そのものの質を確かめるためにテストをしたいのではなく、今後の改造で前後に処理を付け足しても、確率が1/3から変わらないことを確かめるためにテストをしたい。
こういった場合に広く使われている方法等があれば、ご教示お願いします。
考えたこと
二項分布に従うはずなので、n回試すと、標準偏差は√(2n) / 3になる。
グーが出た回数が、n/3 ± 2σ、つまり
n / 3 ± 2*(√(2n) / 3)
回の範囲でグーが出ていることを確かめれば、大きくは、ずれていないことが分かりそう。
ただし、以下の課題がある。
- このテストは確率的に失敗する
- 「もう一度動かしたら通ったからOK」で、ちゃんとテストできているのか疑問
- 確率がずれていても、偶然通ることもあるので、一体何をテストしているのかよく分からない
- また、似たようなテストが増えてきたら、高確率でどれかが失敗しそう
- nが増えるとテストに時間がかかるが、どれくらいを選ぶのが適当か分からない
乱数のシードを固定すると、コードを変えない限りは、確率的には変わらないようになるが、
やはり、偶然うまくいったシードを使ってるだけなのでは、という疑問は残る。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。