基本的な発想はそれで良いと思います。
random.random()で0~1の一様乱数が取得できるので、これを使うとちょっと直感的に書けます。
python
1>>> def omikuji():
2... value = random.random()
3... if value < 0.1:
4... return "大吉"
5... elif value < 0.4:
6... return "中吉"
7... else:
8... return "小吉"
9>>> result = [omikuji() for i in range(1000)] # 以下正しく動いていることの確認
10>>> result.count("大吉")
1196
12>>> result.count("中吉")
13303
14>>> result.count("小吉")
15601
追記
回答書いてからぐぐってたら、numpy 1.7.0以降を使えば次のように書けるということを知りました。
python
1import numpy as np
2def omikuji():
3 results = ["大吉", "中吉", "小吉"]
4 return results[np.random.choice(3, p=[0.1, 0.3, 0.6])]
もうちょっと頑張ってカスタマイズ性を考慮した結果、こうなりました。
python
1>>> def proba_select(ret_proba_dict):
2... index = sorted(ret_proba_dict.keys())
3... probas = np.array([ret_proba_dict[i] for i in index])
4... probas = probas/(probas.sum())
5... return index[np.random.choice(len(index), p=probas)]
6...
7>>> omikuji = lambda : proba_select({"大吉":0.1, "中吉":0.3, "小吉":0.6})
まあ、ここまでやる必要はないかもしれませんが・・・。
参考(numpy公式)
更に追記
ドキュメントをちゃんと読んだら、第一引数には1-D array likeも渡せました。
なので、もっと簡単にこう書けます。
python
1np.random.choice(["大吉", "中吉", "小吉"], p=[0.1, 0.3, 0.6])
難しいことをする必要はありませんでした・・・。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/03/31 01:43
退会済みユーザー
2018/03/31 01:55
2018/03/31 03:28
2018/03/31 04:17