2013-04-09 114 views
1

我想生成随机数字(h,v,d)三元组。在Python中生成具有已知离散概率的随机数

的d数量根据h的随机值产生,V下面的公知的间隔

下面有一个代码示例中的一些if语句

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

你的问题是关于如何计算'd'给出'h'和'v'的值?在这种情况下,你能否以文字形式记下数字应该如何生成?还是关于如何存储'(h,v,d)'元组列表? – YXD 2013-04-09 10:53:25

+0

没有我的问题是如何根据它们的正确概率生成d值 – irini 2013-04-09 10:59:41

+1

您可能会对Eli Bendersky关于[加权随机选择]的页面感兴趣(http://eli.thegreenplace.net/2010/01/22 /加权随机代合蟒/)。 – DSM 2013-04-09 11:03:43

回答

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 
+0

恐怕我无法理解上面的代码在做什么... – irini 2013-04-10 07:39:44

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