2013-04-09 70 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à!