무작위 알고리즘에 의존하는 프로그램을 재현 가능하게 디버깅하는 방법은 무엇입니까?

aa333

무작위 프로그램을 디버깅하기위한 일반적인 원칙과 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무작위 동전 던지기에 달려 있습니다. 따라서 해당 함수의 버그는 각 실행에서 나타날 수도 있고 나타나지 않을 수도 있기 때문에 감지하기가 어려워집니다. 이 경우 디버깅을 어떻게 단순화합니까?

브렌든 F

"무작위 알고리즘을 디버깅하는 방법"질문에 대한 일반적인 대답 :

먼저, 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] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

한 줄에 고정되는 Python 프로그램을 디버깅하는 방법은 무엇입니까?

분류에서Dev

재귀 알고리즘을 올바르게 구현하는 방법은 무엇입니까?

분류에서Dev

다른 응용 프로그램에서 시작된 응용 프로그램을 디버깅하는 방법은 무엇입니까? (VB6)

분류에서Dev

C로 작성되고 Apache2에서 실행되는 cgi 프로그램을 디버깅하는 방법은 무엇입니까?

분류에서Dev

무한 루프로 프로그램을 디버깅하는 방법은 무엇입니까?

분류에서Dev

자바 스크립트에서 TileWindows 알고리즘을 구현하는 방법은 무엇입니까?

분류에서Dev

파이썬에서 FFT 알고리즘을 구현하는 방법은 무엇입니까?

분류에서Dev

검사 할 데이터가 많은 C ++ 프로그램을 디버깅하는 방법은 무엇입니까?

분류에서Dev

배열을 사용하여 C ++ 프로그램을 디버깅하는 방법은 무엇입니까?

분류에서Dev

Chrome 확장 프로그램의 요소에 액세스하기 위해 현재 페이지의 HTML을 읽는 방법은 무엇입니까?

분류에서Dev

Corda에서 ReceiveAll ()의 응용 프로그램은 무엇입니까? 그것을 구현하는 방법?

분류에서Dev

gedit로 c 프로그램을 디버깅하는 방법은 무엇입니까?

분류에서Dev

ARM 플랫폼의 C 프로그램에서 전역 변수 손상을 디버깅하는 방법은 무엇입니까?

분류에서Dev

프롤로그 디버깅에서 중단 점을 줄에 설정하는 방법은 무엇입니까?

분류에서Dev

IOS 용 푸시 알림을 디버깅하는 방법은 무엇입니까?

분류에서Dev

CodeIgniter에서 AJAX의 작동하지 않는 응답을 디버깅하는 방법은 무엇입니까?

분류에서Dev

python tkinter에서 버블 정렬 알고리즘을 올바르게 구현하는 방법은 무엇입니까?

분류에서Dev

디버깅 모드에서 VS를 실행할 때 확장 프로그램 (예 : ReSharper)을로드하지 않는 방법은 무엇입니까?

분류에서Dev

무 방향 그래프에 대한 Java에서 Dijkstra의 알고리즘 구현이 작동하지 않는 이유는 무엇입니까?

분류에서Dev

크롬 확장 프로그램에 알림 작업 버튼을 삽입하는 방법은 무엇입니까?

분류에서Dev

HttpURLConnection을 디버깅하는 방법은 무엇입니까?

분류에서Dev

앱 및 기능 메뉴에서 존재하지 않는 프로그램을 제거하는 방법은 무엇입니까?

분류에서Dev

내 C 수학 프로그램의 일부를 디버깅하는 방법은 무엇입니까?

분류에서Dev

Windows에서 관리자 권한으로 현재 실행중인 모든 프로그램을 표시하는 방법은 무엇입니까?

분류에서Dev

서버에서 x 분마다 알고리즘을 실행하는 방법은 무엇입니까?

분류에서Dev

Azure Devops 대시 보드 위젯을 쉽고 빠르게 디버깅하는 방법은 무엇입니까?

분류에서Dev

Azure Devops 대시 보드 위젯을 쉽고 빠르게 디버깅하는 방법은 무엇입니까?

분류에서Dev

모든 하위 디렉터리를 현재 디렉터리로 이동하는 방법은 무엇입니까?

분류에서Dev

Bresenham의 라인 알고리즘을 구현하면 gldrawpixels ()를 사용하는 프로그램이 충돌합니다. 그 이유는 무엇입니까?

Related 관련 기사

  1. 1

    한 줄에 고정되는 Python 프로그램을 디버깅하는 방법은 무엇입니까?

  2. 2

    재귀 알고리즘을 올바르게 구현하는 방법은 무엇입니까?

  3. 3

    다른 응용 프로그램에서 시작된 응용 프로그램을 디버깅하는 방법은 무엇입니까? (VB6)

  4. 4

    C로 작성되고 Apache2에서 실행되는 cgi 프로그램을 디버깅하는 방법은 무엇입니까?

  5. 5

    무한 루프로 프로그램을 디버깅하는 방법은 무엇입니까?

  6. 6

    자바 스크립트에서 TileWindows 알고리즘을 구현하는 방법은 무엇입니까?

  7. 7

    파이썬에서 FFT 알고리즘을 구현하는 방법은 무엇입니까?

  8. 8

    검사 할 데이터가 많은 C ++ 프로그램을 디버깅하는 방법은 무엇입니까?

  9. 9

    배열을 사용하여 C ++ 프로그램을 디버깅하는 방법은 무엇입니까?

  10. 10

    Chrome 확장 프로그램의 요소에 액세스하기 위해 현재 페이지의 HTML을 읽는 방법은 무엇입니까?

  11. 11

    Corda에서 ReceiveAll ()의 응용 프로그램은 무엇입니까? 그것을 구현하는 방법?

  12. 12

    gedit로 c 프로그램을 디버깅하는 방법은 무엇입니까?

  13. 13

    ARM 플랫폼의 C 프로그램에서 전역 변수 손상을 디버깅하는 방법은 무엇입니까?

  14. 14

    프롤로그 디버깅에서 중단 점을 줄에 설정하는 방법은 무엇입니까?

  15. 15

    IOS 용 푸시 알림을 디버깅하는 방법은 무엇입니까?

  16. 16

    CodeIgniter에서 AJAX의 작동하지 않는 응답을 디버깅하는 방법은 무엇입니까?

  17. 17

    python tkinter에서 버블 정렬 알고리즘을 올바르게 구현하는 방법은 무엇입니까?

  18. 18

    디버깅 모드에서 VS를 실행할 때 확장 프로그램 (예 : ReSharper)을로드하지 않는 방법은 무엇입니까?

  19. 19

    무 방향 그래프에 대한 Java에서 Dijkstra의 알고리즘 구현이 작동하지 않는 이유는 무엇입니까?

  20. 20

    크롬 확장 프로그램에 알림 작업 버튼을 삽입하는 방법은 무엇입니까?

  21. 21

    HttpURLConnection을 디버깅하는 방법은 무엇입니까?

  22. 22

    앱 및 기능 메뉴에서 존재하지 않는 프로그램을 제거하는 방법은 무엇입니까?

  23. 23

    내 C 수학 프로그램의 일부를 디버깅하는 방법은 무엇입니까?

  24. 24

    Windows에서 관리자 권한으로 현재 실행중인 모든 프로그램을 표시하는 방법은 무엇입니까?

  25. 25

    서버에서 x 분마다 알고리즘을 실행하는 방법은 무엇입니까?

  26. 26

    Azure Devops 대시 보드 위젯을 쉽고 빠르게 디버깅하는 방법은 무엇입니까?

  27. 27

    Azure Devops 대시 보드 위젯을 쉽고 빠르게 디버깅하는 방법은 무엇입니까?

  28. 28

    모든 하위 디렉터리를 현재 디렉터리로 이동하는 방법은 무엇입니까?

  29. 29

    Bresenham의 라인 알고리즘을 구현하면 gldrawpixels ()를 사용하는 프로그램이 충돌합니다. 그 이유는 무엇입니까?

뜨겁다태그

보관