2017-12-05 22 views
0

이것이 이미 게시 되었다면 나를 용서하십시오. :) 나는 하루 종일 머리 속에 고생하여 효율적인 해결책을 생각하려고했습니다. 근본적으로 문제는 다음과 같습니다. 동전을 30 억 번 뒤집어서 모든 뒤집기 후 머리의 양을 반환하는 함수를 원한다고 상상해보십시오. 한 가지 가능한 솔루션은 분명히 for 루프를 반복하여 30 억 회 반복하여 머리와 꼬리의 수를 기록하고 머리를 반환하는 것입니다. 이는 분명히 비효율적 인 솔루션입니다. 나는 이항 확률을 생각해 보았지만이 문제를 푸는데 도움이 될 수있는 곳을 알 수 없었다.코인 뒤집기 - 랜덤 결과 반환

예를 들어 NumberOfHeads (flip) 함수에서 대부분의 시간 (통계적으로)을 입력하면 flips/2 주변의 숫자가 반환 될 수 있습니다. 그러나 flips = 30 억이라고 말하면, 결코) 머리가 1000 개나 될 수 있습니다. 호프 내가 무슨 일이 잘 날 괴롭혀 설명했다 :) 어떤 reponses 주셔서 감사합니다.

+0

이것은 1 머리, 2 머리, 3 머리 ... 등의 확률을 계산 한 다음 그 확률을 사용하고 무작위로 한 번 선택하십시오. 10 플립처럼 더 간단한 문제의 확률을 조사한 다음 해당 형식을 사용하여 'n'플립의 확률 목록을 계산하십시오. 확률 목록을 얻은 후에는 다른 무게의면을 가진 다이를 굴리는 것과 같습니다. –

+1

30 억 플립과 같은 숫자를 사용하면 [가우스 근사법] (https://en.wikipedia.org/wiki/Binomial_distribution#Normal_approximation)을 사용합니다. – user2357112

+0

죄송합니다. 나는 확률을 계산하는 방법을 안다. 그리고 내가 바라는 것이 아니다. 나는 특정 수의 넘을 때 머리 수가 무작위로 반환되는 함수를 원합니다. 예를 들어, NumberOfHeads (10) 또는 10 flips는 대부분 4에서 6을 반환하지만 0으로 돌아갈 확률을 갖습니다. – NightShade

답변

1

여기서 scipy.stats.binom을 사용할 수 있습니다. 아래의 함수는 각 (bernoulli) 재판에서 공정한 코인 플립이있는 임의로 샘플 된 이항 분포에서 머리 수를 반환합니다.

import scipy.stats as scs 
def num_heads(num_flips): 
    flips = scs.binom(n=num_flips, p=0.5) 
    return np.asscalar(flips.rvs(1)) 

num_heads(3000000000) 
# 1499985766 

.rvs() 여기 임의 변량을 의미합니다.

소스를 통해보고하지 않고, 그때 (0 ~ U에서 페이지을 선택, 역 CDF를 고려하여 분석 이항 CDF P = CDF (x)는를 사용하는 난수 생성을 추측거야 , 1) 분포. 그 방법에 대한 더 자세한 정보는 Downey - ThinkStats - 섹션 5.6에서 읽을 수 있습니다. Disclosure : 저는 종종 그렇듯이 완전히 틀릴 수도 있습니다.