0

寻找调试随机程序的一般原则,以及在 Python 中执行此操作的任何具体指南。

例如,考虑以下在跳过列表中的插入实现:

#inserts key into the lowest level list and then promotes it upwards based on coin flips
    def insert(self,key):
        new_node = SkipListNode()
        new_node.val = key
        #insert in order in the lowest list
        self.orderedInsert(new_node,self.search(key,True))
        flip = random.randint(0,1)
        level = 0
        level_node= new_node
        #promote upwards based on coin flips
        while flip == 1:
            level_up_node = SkipListNode()
            level_up_node.val = key
            #see if an upper level exists, if not create it
            if(len(self.lists)-1<=level):
                ...
            #upper level exists, move back find the first element with an up
            #insert new node as it's next
            else:
                ...
            ...
            level +=1
            flip = random.randint(0,1)

insert取决于随机掷硬币。因此,该函数中的错误变得难以检测,因为它可能会或可能不会出现在每次运行中。在这种情况下,我们如何简化调试?

4

1 回答 1

2

作为对“如何调试随机算法”问题的一般回答:

首先,您必须意识到该random模块使用的随机数生成器是一个伪随机数生成器。它用一个种子(一个起始数字)初始化自己,然后用它来确定性地生成一个看似随机的序列。如果它以相同的初始编号再次播种,它将生成相同的序列。

有了这些知识,我们可以查看文档random并查看它确实可以让您自己挑选种子。它还告诉您它通常用于种子的内容:https ://docs.python.org/2/library/random.html#random.seed

所以这给了我们这个代码,你可以把它放在你的随机算法中:

import os
import time
import random
def init_rand(seed=None):
    if seed is None:
        try:
            seed = os.urandom(8)
        except NotImplementedError:
            seed = time.time()
    print 'seed: %s' % seed
    random.seed(seed)

现在,如果你总是init_rand在运行随机算法之前调用,默认情况下你的算法将和以前一样工作,除了它还会告诉你它使用了哪个种子。如果您有需要调试的错误,那么您可以init_rand使用生成错误的种子调用,您将获得完全相同的行为,为您提供 100% 的可重复性。

于 2014-05-24T07:11:53.463 回答