以指定的概率/机会获取元素

要写个随机生成装备的程序,其中装备的品质分四等,概率不同,概率和为1.这即是以指定的概率获取元素。python并没有直接的方法可以实现该功能。

找了个解决的方法,首先随机一个0到1的浮点数,之后同时循环元素及其概率,计算不断增加的累积概率,直到这个概率值大于伪随机数,对应的元素即是选中的元素。

另一个有点类似的任务是根据一个非负整数的序列所定义的权重进行随机撷取-基于机会,而不是概率。这个问题有一个生成器的方案来实现。生成器首先准备一个table,它的元素的数目是sum(relative_odds)个,sequence中的每个元素都可以在table中出现多次,出现的次数等于它在relative_odds序列中所对应的非负整数。一旦table被制作完毕,生成器的主体就可以变得又小又快,因为它只需要将随机撷取的工作委托给random.choice。

两者的代码与测试如下:

 1 import random  
 2 
 3 def random_pick1(some_list, probabilities):  
 4       x = random.uniform(0, 1)  
 5       sum_probability = 0.0  
 6       for item, item_probability in zip(some_list, probabilities):  
 7             sum_probability += item_probability  
 8             if x < sum_probability: 
 9                 break  
10       return item 
11 
12 def random_pick2(sequence, relative_odds):  
13       table = [ z for x, y in zip(sequence, relative_odds) for z in [x]*y ]  
14       while True:  
15             yield random.choice(table) 
16 
17 l1 = ['green', 'blue', 'purple', 'yellow']
18 l2 = [0.7, 0.1, 0.05, 0.15]
19 for i in xrange(10):
20     print random_pick1(l1, l2)
21 
22 print '=' * 20
23 
24 l3 = [100, 10, 5, 15]
25 gene = random_pick2(l1, l3)
26 for res in zip('1234567890', gene):
27     print res

一个可能的输出如下:

 

posted on 2012-09-01 22:36  小交响曲  阅读(446)  评论(0编辑  收藏  举报

导航