コイン投げから離散ユニフォームを生成する


9

あなたが好きなだけ何度でもフリップできる公正なコインを持っているとしましょう(おそらく無限に無限です)。で離散均一分布を生成することは可能ですか?ここで、は2の累乗ではありませんか?どうしますか?、K(1,2,...,k)k

これが一般的すぎる場合、と答えるのはおそらく十分興味深いでしょう。k=3


承知しました!そして、ケースは実際に有益です。コインをペアでめくることを考えてください(必要に応じて繰り返し)。可能な結果は何ですか?ここで、この手順の結果の結果を、希望する分布が得られるような方法でマッピングできますか?k=3
枢機卿

そうそう。それはすばらしい。たとえば、HH = 1、HT = 2、TH = 3、およびTT =ペアを再フリップします。ホホホ、今私はコインフリップからのエントロピーと、フリップからの情報を最大化する方法について考えています(しかし、私はそれを自分で行います!
renrenthehamster

ここに、まさにあなたがやりたいことのための疑似コードを含む素晴らしい論文があります: arxiv.org/pdf/1304.1916v1.pdf

1
@renrenthehamster:はい、これはです。「成功」をフリップから有効な結果を取得すると定義すると、成功の確率は常にです。したがって、そのような試行の数は幾何学的であり、平均は2以下です。また、以上のそのような試行が必要になる確率は指数関数的に減少します。ログ2 K 1 / 2 メートルO(log2k)log2k1/2m
枢機卿

1
@ren:発見に基づいて回答を作成することを検討してください。私は、一つには、賛成投票をさせていただきます。乾杯。:-)
枢機卿

回答:


5

上記のコメントで述べたように、ペーパーhttp://arxiv.org/pdf/1304.1916v1.pdfは、コインフリップから離散均一分布から生成する方法を正確に詳しく説明し、理由の非常に詳細な証明と結果のセクションを提供しますメソッドが機能します。

概念の証明として、私はそれらの疑似コードをコード化して、Rその方法がどれほど速く、シンプルで効率的かを示しました。

#Function for sampling from a discrete uniform distribution
rdunif = function(n){

v = 1 
c = 0
a = 0
while(a > -1){
    v = 2*v
    c = 2*c + rbinom(1,1,.5) #This is the dice roll part

    if(v >= n){
        if(c < n){
            return(c)
        }else{
            v = v-n
            c = c-n
        }
    }
}
}

#Running the function k times for n = 11
n = 11
k = 10000
random.samples = rep(NA,k)

for(i in 1:k){
    random.samples[i] = rdunif(n)
}

counts = table(random.samples)
barplot(counts,main="Random Samples from a Discrete Uniform(0,10)")

ここに画像の説明を入力してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.