低浮点数的比较

时间:2016-06-17 18:44:18

标签: python python-2.7

我有一种执行轮盘赌选择的方法。

action_to_execute=self.weighted_choice_sub(phermone_list)
def weighted_choice_sub(self,weights):
        '''performs weighted selection or roulette wheel selection on a list
        and returns the index selected from the list'''
        rnd = random.random() * sum(weights)
        for i, w in enumerate(weights):
            rnd -= w
            if rnd < 0:
                return i

在时间它什么都不返回,因为它返回None而不是索引。这意味着条件rnd < 0永远不会是True

(Pdb) phermone_list
[5e-324, 5e-324, 5e-324, 5e-324, 1.5e-323, 5e-3 1.5e-323, 2.5e-323, 5e-324]
(Pdb) action_to_execute
(Pdb) type(action_to_execute)
<type 'NoneType'>

我无法理解发生了什么,以及如何解决它。我认为它与传递的列表中的极低值有关。

更新(调试运行):

(Pdb) phermone_list
[5e-324, 5e-324, 5e-324, 5e-324, 5e-324, 5e-324, 5e-324, 5e-324, 5e-324]
def weighted_choice_sub(self,weights):
        '''performs weighted selection or roulette wheel selection on a list
        and returns the index selected from the list'''
        rnd = random.random() * sum(weights)
        print "____"
        for i, w in enumerate(weights):
            print (i,w)
            rnd -= w
            print rnd
            if rnd < 0:
                return i
(0, 5e-324)
3.95252516673e-323
(1, 5e-324)
3.45845952089e-323
(2, 5e-324)
2.96439387505e-323
(3, 5e-324)
2.47032822921e-323
(4, 5e-324)
1.97626258336e-323
(5, 5e-324)
1.48219693752e-323
(6, 5e-324)
9.88131291682e-324
(7, 5e-324)
4.94065645841e-324
(8, 5e-324)
0.0

0 个答案:

没有答案