上一篇筆記的pygame游戲對敵人和白雲的移動速度使用了隨機函數randint()
,游戲體驗不是太好。如果是按概率隨機選取設置速度的話,游戲體驗會好一些。
據我了解,random.choice(seq)
是等概率選取一個,不是我想要的。而 numpy.random.choice(seq, p, k)
是按概率隨機重復選取多個,這正是我想要的。
但是,我不想為這么一個函數引入巨大的numpy庫,所以打算自己實現一個按概率隨機選取的函數。
特此將代碼記錄如下:
# 作者:hhh5460
# 時間:2017年6月17日
import random
# 根據概率隨機選取
def random_choice(seq, prob, k=1):
'''
功能:
按給定概率prob,從seq中選取元素。可重復k次
注意
1. seq, prob長度要相等
2. prob的概率和要等於1
3. k 表示重復選取的次數,默認為1次
4. 結果返回list
5. 用到了random模塊的random()函數
例子:
>>> random_choice(['a','b','c','d'], [0.4, 0.15, 0.1, 0.35])
['d']
>>> random_choice('abcd', [0.4, 0.15, 0.1, 0.35], k=5)
['d','d','b','a','d']
'''
res = []
for j in range(k):
p = random.random()
for i in range(len(seq)):
if sum(prob[:i]) < p <= sum(prob[:i+1]):
res.append(seq[i])
return res
# 測試
def test():
print(random_choice(['a','b','c','d'], [0.4, 0.15, 0.1, 0.35], k=5))
test()