プロが教えるわが家の防犯対策術!

上記のdice関数を参考に,P1からP5 (P6は 1 - P1 - P2 - ... - P5によって与えられる)が引数として与えられた際に,不均一なサイコロを実現する関数unfair_diceを作成せよ.

def unfair_dice(p1, p2, p3, p4, p5):
"""不均一なサイコロ

Parameters
----------
p1, p2, p3, p4, p5 : float
サイコロの各目 i (i = 1,..., 6) の出る確率.
ここで,6の目が出る確率は p6 = 1 - (p1 + ... + p5) である.
任意のi = 1 ,..., 6について0 <= pi <= 1でなければならない.

Returns
-------
サイコロの目
"""
if p1 < 0 or p2 < 0 or p3 < 0 or p4 < 0 or p5 < 0:
raise ValueError("pi must be greater than zero.")
if p1 + p2 + p3 + p4 + p5 > 1:
raise ValueError("p1 + ... + p5 must be smaller than one.")
# 以下,各自編集

こういったもなのですが全く進められません。
どなたかどのようなプログラミングをすればいいのか詳しく教えてください。
よろしくお願いいたします。
言語はPythonです。

A 回答 (4件)

x=random.random()


if x<p1:
return 1
elif p1>= x and x < p1+p2:
return 2
elif p1+p2 <= x and x < p1+p2+p3
return 3
:
:
というかんじ。
簡単な話なんだけど数学レベルの理解不足?
    • good
    • 0

「上記のdice関数」に、乱数を受けて、1~6のどれかをまんべんなく返すようにしているところがあるはずなので、そこを、p1 ~ p6 の頻度にすれば良い。

    • good
    • 0

sum[i=1..6](p[i]) = 1 となる p[6] を決める


一様乱数で 0 以上 1 未満の値 x を一つ求める
x < sum[i=1..y](p[i]) となる最小の y を求める
y をさいころの目として返す
    • good
    • 0

> 上記のdice関数を参考に



上記のdice関数って何?
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!