怎么按照设定概率产生不重复的随机排序?

  统计/机器学习 概率分布 抽样方法 Python    浏览次数:839        分享
1

例如5个运动员参加比赛,运动员A有10%的概率夺冠,B有30%的概率,C有5%的概率,D是15%,E有40%。现在想产生一个随机的名词排序,抽样的时候要符合上面的概率。

这个问题可以是看作是无放回的抽样,但是又要保证每个数都要正好只出现一次。

在python里的实现方式没有什么思路,求助大家。

 

点点   2022-04-04 17:12



   1个回答 
2

看来下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面经

Willyd   2022-04-09 23:45



  相关讨论

关于两个正态总体抽样分布的独立性问题

python对给定的集合进行有放回抽样?

python产生一个随机置换?

cooks距离是什么?有什么含义?怎么计算?

两阶段抽样和分层抽样是一回事吗?

Jackknife vs Bootstrap

滚雪球抽样算法的实现

parametric bootstrap和nonparametric bootstrap的区别是什么?

bootstrap 一般用在哪些方面

自助法(bootstrap)的0.632是怎么来的?

  随便看看

如何复制一个pandas DataFrame

线性回归需要满足哪些基本前提假设

怎么从矩母函数(mgf)推导得到概率密度函数(pdf)?

pandas读取csv中指定的某些列

python产生服从常用概率分布的随机数