我想生成随机三位数(h,v,d)。
根据一些if语句后面的h,v的随机值生成d数
h和v是已知间隔内的整数
下面是一个代码示例:
l="low"
m="medium"
h="high"
for i in range (100):
h=random.random()*3
v=random.choice(['low', 'medium', 'high'])
d1=1
d1_2=random.randint(1,2)
d1_3=random.randint(1,3)
if 0<h<0.5 or h==0:
if v==l:
d=d1
elif v==m:
d=d1_2
elif v==h:
d=d1_3
d1的概率为83.3%,d1_2的概率为6.7%,而d1_3的概率为10%
如何在Python中插入这些可能性
非常感谢你提前...
答案 0 :(得分:4)
您希望列表中的随机元素具有不同的权重,对吗?
def weighted_random(weights):
number = random.random() * sum(weights.values())
for k,v in weights.iteritems():
if number < v:
break
number -= v
return k
# the following values can be any non-negative numbers, no need of sum=100
weights = {'d1': 83.3,
'd1_2': 6.7,
'd1_3': 10.}
for i in xrange(10):
print weighted_random(weights),
打印,作为示例
d1 d1 d1 d1_2 d1 d1 d1 d1_3 d1 d1_2
答案 1 :(得分:0)
因此,如果我理解正确,你希望变量'v'取值为d1,概率为0.833(比如p1),d1_2取概率为0.067(称之为p2),d1_3取概率为0.1(p3) )
为此,您可以生成介于0和1之间的均匀分布数字,并检查该数字是否小于p1。如果是,那么你让它取第一个值。如果没有,你检查它是否小于p1 + p2。如果是这样,那么你让它采取第二个值。最后,如果这两种情况都不是,那么您使用最终值。一些简单的代码如下:
p_1 = 0.833
p_2 = 0.067
p_3 = 0.1
r = numpy.random.rand()
if r < p_1:
v = d1
elif r < (p_1 + p_2):
v = d1_2
else:
v = d1_3
答案 2 :(得分:0)
你可以这样计算机会;
<强> 83.3%强>
import random
rand = random.randint(100,10000) * 0.010
if rand <= 83.3:
print('success: ' + str(rand))
else:
print('failed: ' + str(rand))
示例结果
192:Desktop allendar$ python test.py
success: 35.7
192:Desktop allendar$ python test.py
success: 60.03
192:Desktop allendar$ python test.py
success: 51.97
192:Desktop allendar$ python test.py
success: 45.58
192:Desktop allendar$ python test.py
failed: 87.53
192:Desktop allendar$ python test.py
success: 33.11
192:Desktop allendar$ python test.py
success: 50.68
192:Desktop allendar$ python test.py
success: 81.8
答案 3 :(得分:0)
您还可以使用Lea,一个专门用于离散概率分布的纯Python包。
>>> distrib = Lea.fromValFreqs(('d1',83.3),('d1_2',6.7),('d1_3',10.))
>>> print distrib.asPct()
d1 : 83.3 %
d1_2 : 6.7 %
d1_3 : 10.0 %
>>> distrib.random(10)
('d1', 'd1', 'd1', 'd1', 'd1_3', 'd1', 'd1', 'd1', 'd1', 'd1_3')
Etvoilà!