いくつかの公平な6面ダイス(d6)を振って、1から特定のまでの整数を描きたい。良い答えは、そのメソッドが均一で独立した整数を生成する理由を説明します。
説明のための例として、場合にソリューションがどのように機能するかを説明すると役立ちます。
さらに、この手順が可能な限り効率的であることを望みます。つまり、生成される各数値に対して、平均でd6の最小数をロールします。
老人から小数への変換は許可されています。
いくつかの公平な6面ダイス(d6)を振って、1から特定のまでの整数を描きたい。良い答えは、そのメソッドが均一で独立した整数を生成する理由を説明します。
説明のための例として、場合にソリューションがどのように機能するかを説明すると役立ちます。
さらに、この手順が可能な限り効率的であることを望みます。つまり、生成される各数値に対して、平均でd6の最小数をロールします。
老人から小数への変換は許可されています。
回答:
面を持つダイスの独立したロールの個別の識別可能な結果のセットには、要素があります。サイコロが公平な場合、1つのロールの各結果の確率はあり、独立性はこれらの結果のそれぞれが確率つまり、均一な分布
あなたには、いくつかの手順を考案したと仮定どちらか決定する成果のである、の要素- -sidedダイあなたがしなければならないことを意味する( - OR他のレポートの失敗結果を得るためにそれを繰り返します)。あれは、
LET確率であること障害とノートに結果いくつかの整数倍である発言
(将来の参照のために、失敗しない前に呼び出す必要がある回数はことに注意してください)
これらの結果が均一であり、が失敗を報告しないことを条件とするという要件は、すべてのイベント確率を保持することを意味します
どこ
は、プロシージャがイベント割り当てるサイコロのセットです
原子イベントを考えます。これには確率してみましょう(ダイスロールが関連付けられて持つ)要素を。 なります
がすべて整数 に等しいことはすぐにわかります最も効率的な手順を見つけることだけが残っています面のダイスのロールごと の非故障の予想数は
2つの直接的かつ明白な影響があります。 1つは、が大きくなるにつれて小さく保つことができれば、失敗を報告する効果は漸近的にゼロになるということです。もう1つは、任意の(シミュレートするダイスのロールの数)について、をできるだけ小さくしたいということです。
分母をクリアして詳しく見てみましょう。
これにより、特定のコンテキスト()で、を以下の最大の倍数に等しくすることにより、が可能な限り小さくなることが明らかになります。 これを最大の整数関数(または「フロア」)で書くことができますとして
最後に、は冗長性を測定するため、最高の効率を得るためにできるだけ小さくする必要があることは明らかです。具体的には、ダイスのロールを1つ生成するために必要なダイスのロールの予想数は次のとおりです。
したがって、高効率の手順の検索では、が何らかの等しいか、それよりわずかに大きい場合に焦点を当てる必要があります
分析は、与えられたおよびこのアプローチが完全な効率に近似する一連の倍数があることを示すことで終了します。これは、限界でがに近づくを見つけることになります(自動的に保証)。このようなシーケンスの1つはを取得して決定することによって取得されます
証明は簡単です。
これはすべて、元のサイドのダイスを回十分にロールするロールごとにほぼ結果をシミュレートすることを期待できることをます。同様に、
これは、多数のシミュレートすることが可能であるの独立したロールの使用してダイを-sidedフェア、平均使用ダイを-sided十分に大きく選択することにより、を任意に小さくできる結果ごとにロールします。
質問では、およびそこから
したがって、最良の手順では、各結果をシミュレートするために、平均で少なくともロールが必要です。d6
d150
分析はこれを行う方法を示しています。それを実行するために数論に頼る必要はありません:べき乗とべき乗を表にし、それらを比較してを見つけることができますは近いです。このブルートフォース計算はペアを与えます
たとえば、数字に対応
最初の場合、はaの3つのロールの結果のをFailure に関連付け、他の結果はそれぞれaの単一の結果に関連付けられます。 d6
d150
2番目の場合、は14ロールのaの失敗の結果の(それらの約3.1%)を関連付け、それ以外の場合、aの5つの結果のシーケンスを出力します。d6
d150
を実装する簡単なアルゴリズムは、ダイの面に数字を、ダイの面に数字ラベル付けします。最初のダイス のロールは、ベース桁の数字として解釈され これは、ベース数値に変換され 最大で桁の場合、最後の桁のシーケンスが出力になります。それ以外の場合、は自身を再帰的に呼び出してFailureを返します。
はるかに長いシーケンスの場合、 の継続分数展開の他のすべての収束を考慮することにより適切なペア見つけることができます 連続分数の理論は、これらの収束がより小さいか大きいかを交互に繰り返すことを示しています(がすでに合理的でないと仮定)。より小さいものを選択してください
質問では、最初のいくつかのそのような収束は
最後のケースでは、29,036,139ロールのd6
シーケンスによりd150
、故障率が未満のaの10,383,070ロールのシーケンスが生成されます。効率はです。
場合、d6を3回ローリングすると、結果が明確に作成されます。
目的の結果は、次の方法で集計できます。
結果を保持する確率はです。すべてのロールは独立しており、「成功」(結果は)になるまで手順を繰り返すので、1から150の間の1ドローを生成する試行回数は幾何ランダム変数として分散されます。期待値はです。したがって、このメソッドを使用して1つのドローを生成するには、平均でサイコロを振る必要があります(各試行で3サイコロが振られるため)。
チャットでこれを提案してくれた@whuberに感謝します。
場合のSycoraxによる答えのさらに簡単な代替案を次に示します。以来次の手順を実行することができます。
1〜150の一様乱数を生成します。
- 1D6の3つの順序付きロールを作成し、これらをとして示します。
- 最初の2つのロールのいずれかが6である場合、それが6でなくなるまで再ロールします。
- 数字は、基数が5-5-6の位置表記法を使用した均一な数字です。したがって、ように目的の数を計算できます
この方法は、より大きなに一般化できますが、値により大きい1つ以上の素因数がある場合、少し厄介になります。
6面ダイスを使用して値から均一に選択するアルゴリズムの例として、各ロールを使用して使用可能な値にを乗算し、新しい値のそれぞれを均等に可能にするこれを試してください。
ロールの後、残りのつの値のいずれかにいる場合、ロールの後の位置と同様の状況にあります。したがって、同じ方法で続行できますロールの後に停止する確率はであり、ロールの後に停止する確率はなどです。
これらをすると、必要なロールの予想数は約あることがます。等しい確率でそれぞれを選択できるときに一度に値を選択するだけなので、からの均一な選択を提供します。
Sycoraxはコメントで、より明示的なアルゴリズムを求めました
アルゴリズムはサイコロの連続したロールです:
最初の3つのサイコロを振って、からまでの数を生成し。以降 あなたは(によっても分割し、その余りである生成された値を取る生成された値は、厳密に下回る場合)停止;
続行する場合は、からまでの数字を生成するように4番目のをます。以来 次の除算に生成された値の余りを取る生成された値は、厳密に下回る場合と停止;
継続的な場合は、今から番号を生成しているので、第五ダイスを振るに。以来 次の除算に生成された値の余りを取る生成された値は、厳密に下回る場合停止;
継続的な場合は、今から番号を生成しているので、第六ダイスを振るに。以来 あなたは除算に生成された値の余りを取る生成された値は、厳密に下回る場合停止;
等