公正なd6を使用して、1からまでのランダムに整数を独立して均一に描画しますか?


18

いくつかの公平な6面ダイス(d6)を振って、1から特定のまでの整数を描きたい。良い答えは、そのメソッドが均一独立した整数を生成する理由を説明ます。N

説明のための例として、N=150場合にソリューションがどのように機能するかを説明すると役立ちます。

さらに、この手順が可能な限り効率的であることを望みます。つまり、生成される各数値に対して、平均でd6の最小数をロールします。

老人から小数への変換は許可されています。


この質問は、このMetaスレッドに触発されました

回答:


12

面を持つダイスの独立したロールの個別の識別可能な結果のセットには、要素があります。サイコロが公平な場合、1つのロールの各結果の確率はあり、独立性はこれらの結果のそれぞれが確率つまり、均一な分布Ω(d,n)nd=6dn1/d(1/d)n:Pd,n.

あなたには、いくつかの手順を考案したと仮定どちらか決定する成果のである、の要素- -sidedダイあなたがしなければならないことを意味する( - OR他のレポートの失敗結果を得るためにそれを繰り返します)。あれは、tmc(=150)Ω(c,m)

t:Ω(d,n)Ω(c,m){Failure}.

LET確率であること障害とノートに結果いくつかの整数倍である発言FtFdn,

F=Pr(t(ω)=Failure)=NFdn.

(将来の参照のために、失敗しない前に呼び出す必要がある回数はことに注意してください)t1/(1F).

これらの結果が均一であり、が失敗を報告しないことを条件とするという要件は、すべてのイベント確率を保持することを意味しますΩ(c,m)ttAΩ(c,m),

(1)Pd,n(tA)1F=Pc,m(A)

どこ

t(A)={ωΩt(ω)A}

は、プロシージャがイベント割り当てるサイコロのセットですtA.

原子イベントを考えます。これには確率してみましょう(ダイスロールが関連付けられて持つ)要素を。 なりますA={η}Ω(c,m)cm.t(A)ηNη(1)

(2)Nηdn1NFdn=Pd,n(tA)1F=Pc,m(A)=cm.

がすべて整数NηN.等しいことはすぐにわかります最も効率的な手順を見つけることだけが残っています面のダイスのロールごと の非故障の予想数はt.c

1m(1F).

2つの直接的かつ明白な影響があります。 1つは、が大きくなるにつれて小さく保つことができれば、失敗を報告する効果は漸近的にゼロになるということです。もう1つは、任意の(シミュレートするダイスのロールの数)について、をできるだけ小さくしたいということです。FmmcF

分母をクリアして詳しく見てみましょう。(2)

Ncm=dnNF>0.

これにより、特定のコンテキスト()で、を以下の最大の倍数に等しくすることにより、が可能な限り小さくなることが明らかになります。 これを最大の整数関数(または「フロア」)で書くことができますとしてc,d,n,mFdnNFcmdn.

N=dncm.

最後に、は冗長性を測定するため、最高の効率を得るためにできるだけ小さくする必要があることは明らかです。具体的には、ダイスのロールを1つ生成するために必要なダイスのロールの予想数は次のとおりです。Ntdc

N×nm×11F.

したがって、高効率の手順の検索では、が何らかの等しいか、それよりわずかに大きい場合に焦点を当てる必要がありますdncm.

分析は、与えられたおよびこのアプローチが完全な効率に近似する一連の倍数があることを示すことで終了します。これは、限界でがに近づくを見つけることになります(自動的に保証)。このようなシーケンスの1つはを取得して決定することによって取得されますdc,(n,m)(n,m)dn/cm1N=1F0n=1,2,3,

(3)m=nlogdlogc.

証明は簡単です。

これはすべて、元のサイドのダイスを回十分にロールするロールごとにほぼ結果をシミュレートすることを期待できることをます。同様に、dn,logd/logc=logcdc

これは、多数のシミュレートすることが可能であるの独立したロールの使用してダイを-sidedフェア、平均使用ダイを-sided十分に大きく選択することにより、を任意に小さくできる結果ごとにロールします。mcdlog(c)/log(d)+ϵ=logd(c)+ϵϵm


例とアルゴリズム

質問では、およびそこからd=6c=150,

logd(c)=log(c)log(d)2.796489.

したがって、最良の手順では、各結果をシミュレートするために、平均で少なくともロールが必要です。2.796489d6d150

分析はこれを行う方法を示しています。それを実行するために数論に頼る必要はありません:べき乗とべき乗を表にし、それらを比較してを見つけることができますは近いです。このブルートフォース計算はペアを与えますdn=6ncm=150mcmdn(n,m)

(n,m){(3,1),(14,5),}

たとえば、数字に対応

(6n,150m){(216,150),(78364164096,75937500000),}.

最初の場合、はaの3つのロールの結果のをFailure に関連付け、他の結果はそれぞれaの単一の結果に関連付けられます。 t216150=66d6150d150

2番目の場合、は14ロールのaの失敗の結果の(それらの約3.1%)を関連付け、それ以外の場合、aの5つの結果のシーケンスを出力します。t7836416409675937500000d6d150

を実装する簡単なアルゴリズムtは、ダイの面に数字を、ダイの面に数字ラベル付けします。最初のダイス のロールは、ベース桁の数字として解釈され これは、ベース数値に変換され 最大で桁の場合、最後の桁のシーケンスが出力になります。それ以外の場合、は自身を再帰的に呼び出してFailureを返します。d0,1,,d1c0,1,,c1.nnd.c.mmt

はるかに長いシーケンスの場合、 の継続分数展開の他のすべての収束を考慮することにより適切なペア見つけることができます 連続分数の理論は、これらの収束がより小さいか大きいかを交互に繰り返すことを示しています(がすでに合理的でないと仮定)。より小さいものを選択してください(n,m)n/mx=log(c)/log(d).xxx.

質問では、最初のいくつかのそのような収束は

3,14/5,165/59,797/285,4301/1538,89043/31841,279235/99852,29036139/10383070.

最後のケースでは、29,036,139ロールのd6シーケンスによりd150、故障率が未満のaの10,383,070ロールのシーケンスが生成されます。効率はです。2×108,2.79649


2
いつものように驚くべきことですが、質問が尋ねられる前であっても、この回答はフォーマットされ準備されているように見えます!
ルカシュGradの

1
@ŁukaszGrad、ありがとうございます。しかし、私はそのような陰謀に無邪気であり、鋭い目をした読者が私がこれを書いた速攻の証拠を見つけると確信しています。
whuber

が素数でない場合、サンプル空間を等しい確率のサブセットに分割できることも考慮に入れるべきではありませんか?たとえば、d6をd2またはd3として使用し、162個の要素を持つサンプルスペース(216より150に近い)を4つのロール1d6 + 3d3で実現できます。(これにより、3d6ソリューションと同じ予想ロールが得られますが、分散は低くなります。)dΩ(d,1)
Scortchi-モニカの復職

@Scortchiあなたは、一様な分布からのドローをシミュレートするために使用するサイコロの選択肢がある、わずかに異なる設定について説明します。同様の分析が適用されます。実行すると面白いかもしれません。
whuber

7

場合、d6を3回ローリングすると、結果が明確に作成されます。N=15063=216

目的の結果は、次の方法で集計できます。

  • d6を3回連続して記録します。これにより、結果生成されます。すべての値が等しくなる可能性がため、結果は均一です(サイコロは公平で、各ロールを個別として扱います)。a,b,ca,b,c
  • それぞれから1を引きます。
  • これは、セナリー番号です。各桁(場所の値)は6の累乗で0から5になるため、を使用して10進数で数値を書き込むことができます
    (a1)×62+(b1)×61+(c1)×60
  • 追加1。
  • 結果が150を超える場合、結果を破棄して再度ロールします。

結果を保持する確率はです。すべてのロールは独立しており、「成功」(結果は)になるまで手順を繰り返すので、1から150の間の1ドローを生成する試行回数は幾何ランダム変数として分散されます。期待値はです。したがって、このメソッドを使用して1つのドローを生成するには、平均でサイコロを振る必要があります(各試行で3サイコロが振られるため)。p=150216=25361,2,,150p1=36253625×3=4.32


チャットでこれを提案してくれた@whuberに感謝します。


ヘンリーの方法は均一な分布を生み出さないと思います。これは、リサイクルにより一部の数字が優先されるためです。リサイクルがどのように行われるのかを完全に理解していないので、私はそれについて完全にはわかりません。
whuber

1
@whuber AH!今、あなたの懸念を理解しています。私はプロセスを自分に説明しようとしましたが、直観に欠陥がある理由に気付きました。追加のサイコロを振る確率によって、確率の10進数への割り当てが変更され、方法が事前にわからないため不均一になる可能性があります多くのサイコロが出ています。
Sycoraxによると、Reinstate Monicaは

4

場合のSycoraxによる答えのさらに簡単な代替案を次に示します。以来次の手順を実行することができます。N=150150=5×5×6

1〜150の一様乱数を生成します。

  • 1D6の3つの順序付きロールを作成し、これらをとして示します。R1,R2,R3
  • 最初の2つのロールのいずれかが6である場合、それが6でなくなるまで再ロールします。
  • 数字は、基数が5-5-6の位置表記法を使用した均一な数字です。したがって、ように目的の数を計算できます (R1,R2,R3)
    X=30(R11)+6(R21)+(R31)+1.

この方法は、より大きなに一般化できますが、値により大きい1つ以上の素因数がある場合、少し厄介になります。N6


1
生成されたドローごとの予想されるロール数に関してこの方法の効率を述べ、結果が1,2、....、150で均一になる理由を明確にできますか
Sycoraxによると、

再ローリングを必要としない結果が得られる確率はであり、回答と同じです。なぜ均一なのかを理解するために、基数5-5-6の位置表記を使用して均一な数値を生成していることに注意してください(つまり、最後の桁は単位、最後から2番目の桁は「6」、3番目は-最後の桁は「30代」です)。25/36
モニカを

1
この方法は、回答の方法のほんのわずかなバリエーションにすぎません。あなたの答えでは、6-6-6数スケールの背番号作成後、私の答えにあなたは無効な値を捨てる一方で、廃棄無効な値を最初 5-5-6スケールの数を生成します。
モニカを

3
+1実際問題として、これは魅力的なアルゴリズムです。ダイスロールによって駆動される有限状態オートマトンを実装することは興味深く、おそらくより広範な分析を示唆しています。{Start、A、B、Accept}の4つの状態があります。ローリング1..5でAへの移行を開始します。ローリング1..5でAがBに移行します。そして、Bは何かを転がすとAcceptに移行します。各トランジションは、それを引き起こしたロールの値を保存するため、Acceptに達すると、3つの保存されたロールのシーケンスを出力し、自動的にStartに戻ります。
whuber

4
@Sycoraxと同じくらい頻繁に拒否しますが、平均してロールを少なくします。予想されたいいえ。変量ごとのロールはです。65+65+1=3.4
Scortchi-モニカの復職

2

6面ダイスを使用して値から均一に選択するアルゴリズムの例として、各ロールを使用して使用可能な値にを乗算し、新しい値のそれぞれを均等に可能にするこれを試してください。1506

  • ロールの後、可能性があり、値を区別するには不十分です。01150
  • ロールした後、可能性がありますが、値を区別するには不十分です16150
  • ロールの後、可能性がありますが、値を区別するには十分ではありません236150
  • ロールの後、可能性があり、値を区別するのに十分ですが、残りの値があります。今停止する確率は321615066150216
  • 停止していない場合、ロールした後、残りのの可能性があり、値を2つの方法で区別するのに十分ですが、残りの値はです。今停止する確率は4396150963001296
  • 停止していない場合、ロールした後、残りのの可能性があり、値を3つの方法で区別するのに十分ですが、残りの値はです。今停止する確率は5576150964507776
  • 停止していない場合、ロールの後、残りのの可能性があり、値を5つの方法で区別するのに十分ですが、残りの値はです。今停止する確率は6756150675046656

ロールの後、残りのつの値のいずれかにいる場合、ロールの後の位置と同様の状況にあります。したがって、同じ方法で続行できますロールの後に停止する確率はであり、ロールの後に停止する確率はなどです。6617027993681501679616

これらをすると、必要なロールの予想数は約あることがます。等しい確率でそれぞれを選択できるときに一度に値を選択するだけなので、からの均一な選択を提供します。3.39614150150


Sycoraxはコメントで、より明示的なアルゴリズムを求めました

  • 最初に、でで作業し615010=4106
  • 第二に、ターゲット値からではなく、1を減算して、ターゲット値がからようにし164106064096
  • 第三に、各ダイスの値は必要があり、ダイスをには、既存の生成された数値の右側にベース桁を追加する必要があります。生成された数値には先行ゼロが含まれる場合があり、その桁数はこれまでのロール数です06566

アルゴリズムはサイコロの連続したロールです:

  • 最初の3つのサイコロを振って、からまでの数を生成し。以降 あなたは(によっても分割し、その余りである生成された値を取る生成された値は、厳密に下回る場合)停止;0006555610006÷4106=16 remainder 15064106100061506=4106

  • 続行する場合は、からまでの数字を生成するように4番目のをます。以来 次の除算に生成された値の余りを取る生成された値は、厳密に下回る場合と停止;4100655556100006÷4106=126 remainder 240641061000062406=53206

  • 継続的な場合は、今から番号を生成しているので、第五ダイスを振るに。以来 次の除算に生成された値の余りを取る生成された値は、厳密に下回る場合停止;5320065555561000006÷4106=1236 remainder 3306410610000063306=552306

  • 継続的な場合は、今から番号を生成しているので、第六ダイスを振るに。以来 あなたは除算に生成された値の余りを取る生成された値は、厳密に下回る場合停止;5523006555555610000006÷4106=12356 remainder 106410610000006106=5555506


あなたは1,2に4D6または5d6、たとえば、の成果をマッピングする方法を説明している場合(1)この回答は150、...、より明確になる
Sycoraxは回復モニカ言う

@Sycorax -私は今、基本提供してきたマッピング6
ヘンリー・

1
エントロピーの考慮事項は、このアルゴリズムよりも大幅に改善できることを示しています。また、アルゴリズムが実際に均一な分布で独立して分布した値を生成することを示すことも残っています。
whuber

@whuber-私のアルゴリズムは、可能性から正確に1つの整数を生成し、ダイスロールが均一で独立していることを均一に提供します。到達すると、各ステップで値のそれぞれが等しく選択される可能性が高くなります。複数の値を生成しません(あなたの答えとは異なります)150150150
ヘンリー

1
「アルゴリズムはサイコロの連続したロールである」と書いて、あなたの意味を誤解しました。(もっと注意深く読んでおく必要があります。)そうすることで、あなたのアルゴリズムは均一な分布を生成しないようですが、一般的なアルゴリズムが何を意図しているのか理解できなかったのでわかりませんあります。統一された値を生成するデモンストレーションを見るといいでしょう。
whuber
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.