给定比例的随机非均匀分布

7
我有三个标签:“A”,“B”,“C”。
我想生成一个包含100个元素的随机列表,其中60%是“A”,30%是“B”,10%是“C”。
我应该怎么做?(我是Python新手,希望这个问题不太傻。)

编辑: 我的问题与此问题略有不同: 使用给定(数字)分布生成随机数

就像评论中所说的那样,我希望恰好60%的元素是“A”,而不是每个元素都有60%的概率是“A”。因此,numpy.random.choice()对我来说不是解决方案。


那样就不算真正的随机了,对吧? - marsh
给定分布的随机数:ABAAACBAAAB - aaaaa says reinstate Monica
啊!这样就更有意义了。 - marsh
1
你需要澄清一下你的意思,是指恰好有60个元素是A,因此你只需要构建一个列表并随机排序,还是每个元素都有60%的机会成为A(因此有时你会得到65个A,有时45个A,很少5个A等等)? - DSM
1
也许这里的一些答案可以帮到你?https://dev59.com/PG855IYBdhLWcg3wj1QS - avacariu
显示剩余4条评论
3个回答

5
您可以对列表进行排列。假设您创建了该列表。
x = list('A'*60 + 'B'*30 + 'C'*10)

然后,您可以像这样原地随机打乱:

from random import shuffle
shuffle(x)

3

假如分布是均匀的,那么 A 将会在平均情况下出现在 60% 的情况中,其他数值也是同理。

import random
res = []
for i in range(0, n_samples):
   r = random.random()
   if(r<=0.6): res.append(A)
   elif(r>0.7): res.append(B)
   elif(r>0.6 and r<=0.7): res.append(C)

一个微小的角落情况,但如果r恰好是0.6或0.7,你的if...elif阶梯将什么也不会做。我添加了“<=”符号。 - smci
r永远不会完全等于0.6,这种可能性在形式上为0(尽管我知道你的意思并且你是对的)。 - aaaaa says reinstate Monica
1
你可以在Python中编写组合条件:0.6 <= r < 0.7 例如:res.append('A' if r < 0.6 else 'B' if 0.6 <= r < 0.9 else 'C') - jfs

3

如果你想恰好让60%的元素为A,30%为B,10%为C,并且你知道总共有100个元素,可以按照以下方式操作:

import random

num = 100
prob_a = 0.6
prob_b = 0.3
prob_c = 0.1

As = int(num*prob_a) * 'A'
Bs = int(num*prob_b) * 'B'
Cs = int(num*prob_c) * 'C'

# create a list with 60 As, 30 Bs, and 10 Cs
chars = list(As + Bs + Cs)
random.shuffle(chars)

print("".join(chars))

这将会输出像BAAAAABBCBAABABAAAACAABBAABACAACBAACBBBAAACBAAAABAAABABAAAAABBBABAABAABAACCAABABAAAAAACABBBBCABAAAAA这样的东西。


我进行了更新,因为旧版本实际上无法正常工作(将一个浮点数乘以一个字符串)。 - avacariu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接