random value generator로 구성된 비율 항의 유한판정법을 loop로 간략히 하는 방법이 있을까요??

조회수 542회

몬테카를로 적분하다가 나오는 건데요.

x0, x1, x2, ...의 변수들을 random.random() 로 정의해 둔다고 가정합니다.

X1/X0 < random.random() 이면 X1(분자)의 값을 기억하고 다음 판정을 시작합니다.

만약 X1/X0 = random.random() 인 경우: X0(분모)값은 그대로 유지되어 다음 단계에서

X2/X0 > random.random() 판정을 시작합니다..

X2/X0 > random.random() 이면 X2(분자)의 값을 기억하고 다음 판정을 시작합니다.

X2/X0 < random.random() 이면 X0(분모)값을 유지하고 다음 판정에 들어갑니다..

즉.. 분자/분모 > random.random() 판정을 해서, 랜덤보다 크면 분자값을 기억해서

다음 판정에 그 값이 다시 들어가고 나머지(분모, random.random()) 값은 새로운 난수로 바뀝니다.

이런식으로 반복해서 랜덤값이 클 때의 구했던 N개의 분자값을 다 구해야 하는데,

그냥 단순하게 for이나 if문으로 짜면, 무한한 if문을 계속 써 넣어야 합니다. ㅠ.ㅠ

이해 잘 안되실테니... 허졉한 코드로나마 설명하자면..

import random
for x in range(100):
    X0 = random.random()
    X1 = random.random()
    X2 = random.random()

    if X1/X0 > random.random() :
        print (X1,1)  # 랜덤보다 크면 분자값을 기억한다( 1은 비율이 랜덤보다 크다는 표식)
        if X2/X1 > random.random():   # 기억했던 X1은 다음 판정에서 분모로 위치하고, X2, random.random()은 독립적인 난수.
            print(X2,1) # 랜덤보다 또 크다면 분자의 값을 기억한다.
            else:
                print(X1,0) # 두번째 판정에서 랜덤보다 작다면 분모의 값을 유지한(0은 비율이 랜덤보다 작았다는 표식))

    else:  # 최초의 판정에서 random보다 작다면 분모값은 그대로 유지된다.
        print(X0,0)

        # 이런식으로 무한반복되서... 비율이 랜덤보다 클 때마다 기억하는 값들을 N개 구해야 합니다.. 
        # 이걸 도대체 어떻게 해야 할까요?

고수님들의 도움 부탁드릴게요 ...

1 답변

  • 좋아요

    0

    싫어요
    채택 취소하기

    재귀함수 만들어서 돌리셔야 할 것 같은데요. 몬테카를로 방법 자체는 처음 들어보지만 그냥 주어진 조건대로만 코딩을 하자면...

    import random
    
    def monte_carlo(supposedly_bigger_number, the_list) :
        if len(the_list) > 9 :
            return the_list
        else :
            possibly_bigger_number = random.random()
            arbitrary_average = random.random()
            if possibly_bigger_number/supposedly_bigger_number > arbitrary_average :
                the_list.append(possibly_bigger_number)
                return monte_carlo(possibly_bigger_number, the_list)
            else :
                the_list.append(supposedly_bigger_number)
                return monte_carlo(supposedly_bigger_number, the_list)
    
    first_number = random.random()
    new_list = []
    print(monte_carlo(first_number, new_list))
    

    질문을 다시 읽고 최대한 의도를 파악해서 데모를 고쳐보았습니다. 활용하실 수 있기를 바랍니다.

    • 감사합니다. ㅠ.ㅠ 일단 이걸 기반으로 노력해볼게요.. 틀이라도 맞춰주셔서 ㄳㄳ.. 박형선 2019.1.8 17:59
    • 답변 약간 수정했어요~ 분자/분모 중 더 큰 수를 다음 판정에 넘기는 처리가 들어갔습니다. 엽토군 2019.1.8 18:15
    • 근데 결과를 돌려보면 뭔가 저 리스트가 뒤로 갈수록 1에 수렴한다거나 그래야 할것 같은데 그런 경향성이 전혀 안보이네요. 이게 원하시는게 맞는지 모르겠는데.. 엽토군 2019.1.8 18:23
    • 그렇긴한데.. 일단 재귀함수도 잘 다룰줄 몰랐던지라... 또 질문 올릴것 같지만.. 암튼 ㄳ합니다 박형선 2019.1.8 18:44

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)