2017-12-05 16 views
0

これはすでに投稿されている場合は私を許し:)私は効率的なソリューションを考えることを試みている一日中私の頭の中で立ち往生問題がありました。基本的にこの問題は次のとおりです。30億回のコイン払いをしなければならないと想像してください。可能な解決策の1つは、forループを30億回繰り返すことで、ヘッドとテールの数を記録してヘッドを返すことです。これは明らかに非効率的なソリューションです。私は二項確率を考えましたが、この問題を解決するためにどこに来るのかわかりませんでした。コインフリッピング - ランダムな結果を返す

例えば、NumberOfHeads(フリップ)関数でほとんどの時間(統計的に)を入力すると、フリップ/ 2の周りの数字が返される可能性があります。しかし、フリップス= 30億と言うと、決してそれは1000の頭部か何かを戻すかもしれない)。私はうまく私を悩まされているものを説明したいと思っています:)すべての応答のおかげで。

+0

これは、1頭、2頭、3頭などの確率を計算し、それらの確率を使用してそれらの間で無作為に1回選択する確率の問題です。 10フリップのようなより単純な問題の確率を調べ、そのフォーマットを使って 'n'フリップの確率のリストを計算する。確率のリストを得た後、それは異なる重みを持つその数の辺を持つダイを転がすようなものです。 –

+1

30億回のフリップのような数字で、[ガウス近似](https://en.wikipedia.org/wiki/Binomial_distribution#Normal_approximation)を使用します。 – user2357112

+0

申し訳ありませんが、これは不明です。私は確率を計算する方法を知っており、それは私が求めているものではありません。私はいくつかのフリップの数に頭の数のランダムな出力を返すいくつかの機能が欲しいです。たとえば、NumberOfHeads(10)または10 flipは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からPを選択すると、逆CDFを取って、分析二項CDF P = CDF(x)のを使用している乱数生成を推測するつもりです、1)分布。その方法について詳しくは、Downey - ThinkStats - 5.6節を参照してください。開示:私はよくあるように、私は完全に間違っているかもしれません。

関連する問題