例如5个运动员参加比赛,运动员A有10%的概率夺冠,B有30%的概率,C有5%的概率,D是15%,E有40%。现在想产生一个随机的名词排序,抽样的时候要符合上面的概率。
这个问题可以是看作是无放回的抽样,但是又要保证每个数都要正好只出现一次。
在python里的实现方式没有什么思路,求助大家。
1个回答
看来下numpy random里的permutation和choice都不能满足题主的要求。
我试着自己写了一个,基本上是暴力解法,轻拍
import numpy as np
def random_rank(members, probs):
if len(members) <= 1:
return members
else:
rank_1 = np.random.choice(members, size=1, p=np.array(probs)/np.sum(probs))[0]
rank_1_i = members.index(rank_1)
new_members = members[:rank_1_i] + members[rank_1_i+1:]
new_probs = probs[:rank_1_i] + probs[rank_1_i+1:]
rank_else = random_rank(new_members, new_probs)
return [rank_1] + rank_else
用了递归的思想,先从members里按照概率,产生一个冠军;冠军产生后把他从members剔除掉,然后剩下的人里按照概率再产生一个冠军,然后依次进行。
SofaSofa数据科学社区DS面试题库 DS面经