random value generator로 구성된 비율 항의 유한판정법을 loop로 간략히 하는 방법이 있을까요??
조회수 544회
몬테카를로 적분하다가 나오는 건데요.
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 답변
-
재귀함수 만들어서 돌리셔야 할 것 같은데요. 몬테카를로 방법 자체는 처음 들어보지만 그냥 주어진 조건대로만 코딩을 하자면...
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
댓글 입력