在Python中生成具有已知离散概率的随机数

时间:2013-04-09 10:47:51

标签: python

我想生成随机三位数(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中插入这些可能性

非常感谢你提前...

4 个答案:

答案 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à!