무작위 프로그램을 디버깅하기위한 일반적인 원칙과 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
무작위 동전 던지기에 달려 있습니다. 따라서 해당 함수의 버그는 각 실행에서 나타날 수도 있고 나타나지 않을 수도 있기 때문에 감지하기가 어려워집니다. 이 경우 디버깅을 어떻게 단순화합니까?
"무작위 알고리즘을 디버깅하는 방법"질문에 대한 일반적인 대답 :
먼저, 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 % 재현성을 얻을 수 있습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다