2016-07-10 9 views
0

프로그램이 제대로 작동하지 않는 데 문제가 있습니다. 목표는 다음과 같이 동전 뒤집기를 시뮬레이션하는 것입니다.파이썬에서 코인 플립 실험 시뮬레이션

임의의 숫자 시퀀스를 고려하십시오. epsilon_1, epsilon_2, ... , epsilon_N. 이 시퀀스의 각 용어는 각각 동전 던지기 실험, 머리 또는 꼬리의 결과에 따라 값이 +1 또는 -1입니다.

# for n = 1,2,...,N: 
# flip coin 
# if result == "Heads" 
    # epsilon_{n} = 1 
# else: 
    # epsilon_{n} = -1 

내가 각 엡실론의 값을 저장할 : 즉

지금 for each n = 1,2,...,N:

epsilon_n = { +1 with probability = 1/2; and -1 with probability = 1/2.

, 나는 나에게이 프로그램을 작성하는 데 도움이되는 몇 가지 사이비 - 코드를 작성 n (따라서 각 n에 대한 실험의 결과)을 배열에 저장합니다.

# array to store outcome of the coin flip 
epsilon = np.zeros(N) 

# define coin flip experiment 
result = [] # result of the experiment 
for n in xrange(1, N): 
    def coin_flip(): #flip coin for each n = 1,...,N 
     flip = random.randint(0,2) 
     if (flip == 0): 
      result = "Heads" 
     else: 
      result = "Tails" 
     return result 
    if result == "Heads": 
     epsilon[n] = 1 
    else: 
     epsilon[n] = -1 

print epsilon 

이 프로그램의 출력이 0을 상기 제 1 항목을 배열하고, 다른 모든 항목 값을 포함 -1 : 여기이를 희망 I 쓴 프로그램이다. 나는 N = 100을 지정했다.

일부 안내는 필요한 것입니다. 예를 들어, 나는 동전 던지기 실험을위한 함수를 정의하는 것으로 바른 길에 있다고 생각합니다. 실험 결과 (Heads 또는 Tails)를 반환하려면이 값이 필요합니다.이 값은 각각 n = 0,1,...,N에 대해 발생해야하지만, 그렇게하는 가장 좋은 방법은 확실하지 않습니다. 그렇다면 각각의 코인 플립 결과에 대해 내 프로그램은 +1 또는 -1 값을 epsilon의 배열에 저장해야합니다. 내 제안 된 함수에 대한 매개 변수로 n을 포함해야합니까 ?? 나는 올바른 길을 가고 있는가?

모든 도움을 주시면 매우 감사하겠습니다. 미리 감사드립니다!

편집 : 그래서 numpy와 random 같은 라이브러리를 가져 오는 것을 잊지 않았습니다. 이 코드는 원래 코드에 포함되어 있지만 실제로는 더 큰 프로그램의 일부이므로이 코드 세그먼트를 복사하여 붙여 넣으면 및 import numpy이 누락되었습니다.

+1

'np.random.choice ([1, -1], N)'당신에게 줄 것이다 N 플립 (각각 50 % 확률). 라이브러리 사용을 피하고 있습니까 (운동하는 등)? – ayhan

+0

여기에 올린 코드는 실제로 다른 것을하는 큰 프로그램의 일부이기 때문에 실수로 라이브러리를 생략했습니다. 내 원래 코드가 적절한 라이브러리를 가져 왔습니다. 어쨌든, 정말 고마워! '0'은 기술적으로 정수가 아니므로'[-1,1]'간격에서 제외되므로 제안이 효과가있는 이유는 무엇입니까? – Javier

+0

아니요, 선택할 수있는 목록입니다. 'np.random.choice ([ 'Heads', 'Tails'], N)'을 입력하면'Heads'와'Tails' 배열이 반환됩니다. 'np.random.choice ([ 'a', 'b', 'c'], N)'을 입력하면 동일한 확률로 a, b 또는 c가 선택됩니다. – ayhan

답변

2

코드에 몇 가지 실수가 있습니다. 먼저 결과라는 빈 목록을 만들고 있지만 나중에 코드 결과는 문자열입니다. 그래서 당신은 그 부분을 필요로하지 않습니다.

import numpy as np 
import random 
N = 10 
epsilon = np.zeros(N) 

이렇게하면 결과를 저장할 길이가 N 인 배열이 만들어집니다. 이제 주 오류가 반복됩니다. 당신은 루프 외부에서 해당 기능을 정의하고 각 반복에서 그것을 호출해야합니다 : 그것은 양쪽에 포함이기 때문에 내가 random.randint(0, 1)에 첫 선을 변경

def coin_flip(): #flip coin for each n = 1,...,N 
    flip = random.randint(0, 1) 
    if (flip == 0): 
     result = "Heads" 
    else: 
     result = "Tails" 
    return result 

참고. 이제 coin_flip()을 실행하면 "Heads"또는 "Tails"가 반환됩니다. 그에 따라 루프를 변경 :

for n in xrange(N): 
    result = coin_flip() 
    if result == "Heads": 
     epsilon[n] = 1 
    else: 
     epsilon[n] = -1 

당신이 엡실론 배열을 수정하는 곳입니다. 각 반복에서 나는 coin_flip() 함수를 호출하여 result에 할당한다는 것을 기억하십시오.

array([ 1., 1., 1., -1., -1., 1., -1., -1., -1., -1.]) 

이 그 일의 긴 방법 : 다음과 같이

이제 인쇄 엡실론은 당신에게 배열을 줄 것이다. 대신, (임의 라이브러리) 수행 할 수 있습니다

[random.choice([1, -1]) for _ in range(N)] 
Out[19]: [1, 1, 1, 1, 1, -1, 1, 1, -1, -1] 

또는 (NumPy와 함께 일) :

np.random.choice([1, -1], N) 
Out[20]: array([ 1, 1, 1, 1, -1, -1, -1, -1, -1, -1]) 
+0

자세한 답변을 주셔서 대단히 감사합니다 !! 내가 컴퓨터에서 돌아올 때 그것을 시도 할 것이다. – Javier