1

我想生成随机的数字三元组(h,v,d)。

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 中插入这些可能性???

非常感谢您提前...

4

4 回答 4

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
于 2013-04-09T10:57:11.657 回答
0

因此,如果我理解正确,您希望变量“v”以 0.833 的概率(例如 p1)取 d1 的值,以 0.067 的概率取 d1_2(称为 p2),以 0.1 的概率取 d1_3(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
于 2013-04-09T10:57:37.190 回答
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
于 2013-04-09T11:00:27.653 回答
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')

瞧!

于 2013-12-13T12:20:17.160 回答