乱数を手動で生成する


30

たとえば、標準正規分布からの10の実現など、特定の分布から乱数を手動で生成するにはどうすればよいですか?


10
これを行う理由と、他にどのような制約があるかを説明できますか?
mdewey

2
乱数のテーブルを取得できます(他の人の間で公開するために使用されるランド)。
バットマン

4
@Batman:確かに、10 の乱数のRANDブックは Amazonで655件のコメントを得ました。もちろん、すべて予測可能です。
西安

10
(これについて誰も以前にコメントしていないことに驚いています)絶対に本質的な場合を除き、カスタム実装を使用して乱数を生成しようとしないでください。はい、それを行う方法を知ることは素晴らしいことであり、おそらく「MCメソッド」クラスで最初に示されるものです(そしてそれは素晴らしいことです!)が、実際のプロジェクトではそれをしないでください。特殊な乱数生成ルーチンが存在する理由には、ゼロからコアアルゴリズムを実装すると、時間の損失、バグの原因、およびフィールド認識の努力が不十分です。
usεr11852は回復モニック言う

2
@ Xi'an:はい、それは安全な推定であることに同意します。前述のように、これは、RNG設計が非常に深刻なビジネスであることを認識せずに、人々が自分のRNGを使用することを警告する単なるコメントです。するために、フォン・ノイマンを引用「罪の状態では、当然のランダムな数字であるが、生産の算術メソッドを考慮し、任意のものを。」
usεr11852は回復モニック言う

回答:


46

「手動」に「機械」が含まれる場合、利用可能な多くのオプションがあります。確率半分でベルヌーイ変数をシミュレートするために、コインを投げることができます:尾に、頭に1。幾何学的分布をシミュレートするために、頭を取得する前に必要なコイントスの数を数えることができます。二項分布をシミュレートするために、コインをn回投げる(または単にn個のコインを投げる)ことができ、頭を数えます。「五点形」または「豆マシン」または「ゴルトンボックスは」ない理由-より多くの運動の代替である行動に1を設定して、自分の目で確かめてください!そうです、「加重コイン」などというものは存在しません01nnしかし、ベルヌーイまたは二項変数の確率パラメータを以外の値に変更したい場合、ジョルジュ=ルイルクレールの針、ブッフォン伯爵はそうすることができます。上の離散的な均一な分布をシミュレートするために、{ 1 2 3 4 5 6 }我々は六面ダイスを振ります。ロールプレイングゲームのファンが発生しているであろう、よりエキゾチックなサイコロを四面ダイスから均一にサンプリングするために、例えば、{ 1 2 3 4 }p=0.5{123456}{1,2,3,4}、スピナーまたはルーレットホイールを使用すると、さらに先に進むことができます。(画像クレジット

さまざまなサイコロ

コンピューターコンソールでコマンドを1つ実行するだけで、今日、この方法で乱数を生成することに怒っている必要がありますか?または、適切な乱数のテーブルがある場合は、本棚のほこりっぽいコーナーに進出しますか?恐らく、物理的な実験について心地よい触覚がありますが。しかし、コンピューター時代以前、実際に広く利用可能な大規模な乱数表(これは後で説明します)の前に働いていた人々にとっては、ランダム変数を手動でシミュレートすることがより実用的な重要性を持ちました。ブッフォンがサンクトペテルブルクのパラドックスを調査したとき—有名なコイントスゲームで、頭を投げるたびにプレイヤーの勝ち額が2倍になり、最初のテールでプレイヤーが負け、予想されるペイオフが直感に反して無限である-彼は幾何分布をシミュレートする必要がありました= 0.5。そうするために、彼は子供を雇い、コインを投げてサンクトペテルブルクのゲームの2048プレイをシミュレートし、ゲームが終了する前に何回投げたかを記録したようです。このシミュレートされた幾何学的分布は、スティグラー(1991)で再現されています。p=0.5

Tosses Frequency
1      1061
2      494
3      232
4      137
5      56
6      29
7      25
8      8
9      6

サンクトペテルブルクのパラドックスに対するこの実証的調査を発表した同じエッセイで、ブッフォンは有名な「ブッフォンの針」も紹介しました。平面は平行線の距離によって短冊状に分割されている場合離れて、長さの針L dはその上にドロップされ、針が線の一つ交差確率である2 リットルdld2lπd

ブッフォンの針実験

ビュフォンの針は、それゆえ、確率変数をシミュレートするために使用することができ又はX二項nは2LXBernoulli(2lπd)、そして我々は、おそらくより便利に当社の針かの長さ()私たちはラインを支配する距離を変更することによって、成功の確率を調整することができます。Buffonの針の別の使用法は、πの確率的近似を見つけるための非常に非効率的な方法です。画像(credit)は17本のマッチ棒を示しており、そのうち11本が線を越えています。罫線間の距離がマッチスティックの長さに等しく設定されている場合、ここで、クロスマッチスティックの予想される割合は2です。バツ二項n2lπdπので、我々は推定することができ π観測された分数の逆数の2倍として:ここでは入手 π =2172ππ^。3408の投げが得られた後1901年にマリオLazzariniは3センチメートル離れ行2.5センチ針を使用して実験を行ったと主張し、 π =355π^=217113.1。これはよく知られたπの有理数で、小数点以下6桁まで正確です。 Badger(1994)は、これが不正あるという説得力のある証拠を提供しています。特に、Lazzariniの装置を使用して精度が小数点以下6桁の95%であると確信するには、忍耐を奪う134兆本の針を投げなければなりません!確かに、Buffonの針は、πを推定する方法よりも乱数生成器としてより有用です。π^=355113ππ


これまでのジェネレーターは、残念ながら離散的でした。正規分布をシミュレートする場合はどうなりますか?1つのオプションは、乱数を取得し、上の一様分布に良好な離散近似を形成するためにそれらを使用することである[01]、これらはランダム正常ずれに変換するために、いくつかの計算を行います。スピナーまたはルーレットのホイールは、0から9までの10進数を与えることができます。サイコロは2進数を生成できます。算術スキルがファンキーなベースに対応できれば、標準のサイコロでも対応できます。他の答えは、この種の変換ベースのアプローチをより詳細にカバーしています。それについての議論は最後まで延期します。

19世紀後半には、正規分布の効用がよく知られたため、ランダムな正規偏差をシミュレートしようとする統計学者がいました。言うまでもなく、最初にシミュレーションプロセスを設定する場合を除き、長い手計算は適切ではなかったでしょう。それが確立されたら、乱数の生成は比較的迅速かつ簡単でなければなりませんでした。スティグラー(1991)は、この時代の3人の統計学者が採用した方法をリストしています。すべてが平滑化技術の研究でした。たとえば、平滑化する必要のある測定誤差をシミュレートするために、ランダムな法線偏差が明らかに興味の対象となりました。

アメリカの著名な統計学者エラストゥス・ライマン・デ・フォレストは、生命表の平滑化に興味があり、正常な逸脱の絶対値のシミュレーションを必要とする問題に遭遇しました。実行中のテーマを証明するものとして、De Forestは実際に半正規分布からサンプリングしていました。また、むしろ1の標準偏差(使用するよりもZN012我々は、「標準」を呼び出すために使用される)、デフォレストは、一つの「予想誤差」(中央値偏差)を望んでいました。これは、「球面天文学と実用天文学のマニュアル、第2巻」の付録の「エラーの確率」の表にある形式でした。ウィリアム・チョベネット。この表から、De Forestは半正規分布の分位数をからp = 0.995に補間しました。これは「等しい頻度のエラー」と見なされました。p=0.005p=0.995

等しい頻度のエラーのDe Forestテーブル

De Forestに従って正規分布をシミュレートする場合は、この表を印刷して切り取ることができます。De Forest(1876)は、エラーは「同じサイズの100ビットの厚紙に刻まれており、箱の中で揺らされ、すべてが1つずつ引き出された」と書いています。

天文学者で気象学者のジョージ・ハワード・ダーウィンir(自然主義者チャールズの息子)は、ランダムな通常の逸脱を生成するための「ルーレット」と呼ばれるものを開発することにより、物事に異なるスピンをかけました。ダーウィン(1877)は次の方法を説明しています。

カードの円形の部分は放射状に目盛りが付けられていたため、マークされた卒業式は720でした。バツ固定半径から離れ度。カードは、固定されたインデックスの近くでその中心の周りを回転するように作られました。その後、何回も回転し、停止するとインデックスの反対側の数字が読み取られました。[ダーウィンは脚注を追加します。ディスクが非常に高速で回転しているときに目盛りが見えないように停止する方が、コースを実行するよりも良いです。]目盛りの性質から、このようにして得られた数字は観察のエラーが実際に発生するのと同じ方法。ただし、接頭辞の付いた加算または減算の兆候はありません。次に、コインを何度も投げて、頭+と尾-を呼び出すことにより、720π0バツeバツ2dバツ+または -は、この一連のエラーに偶然割り当てられます。+

「インデックス」は、ここでは「ポインタ」または「インジケータ」として読む必要があります(「人差し指」を参照)。スティグラーは、デフォレストと同様に、ダーウィンはディスクの周りの半正規累積分布を使用していたことを指摘しています。その後、コインを使用してランダムに標識を付けると、これが完全な正規分布になります。スティグラーは、目盛りがどれだけ細かく目盛りが付いているかは不明であると指摘しているが、手動でディスクのミッドスピンを停止する指示は「ディスクの一部への潜在的なバイアスを減らして手順を高速化する」ことであると推測している。

チャールズダーウィンの半従兄弟であるフランシスガルトンirは、彼の五重奏曲に関連してすでに言及されています。これは、2項分布を機械的にシミュレートしますが、ドモワールラプラスの定理により、通常の分布と際立った類似性があり(また、そのトピックの教材として使用されることもあります)、ガルトンは、正規分布からのサンプル。この回答の冒頭にある型破りな例よりさらに特別なものとして、Galtonは正規分布ダイスを開発しました。—より正確には、中央値偏差1の正規分布に優れた離散近似を生成するサイコロのセット。1890年以降のこれらのサイコロは、ロンドン大学ユニバーシティカレッジのゴールトンコレクションに保存されています。

ゴールトンの通常のサイコロ

ではでは1890年の記事自然ゴルトンのことを書きました:

ランダムに選択するための手段として、私はサイコロに勝るものはありませんでした。連続する各ドロー間でカードを完全にシャッフルすることは最も退屈であり、バッグ内のマークされたボールを混ぜてかき混ぜる方法はさらに退屈です。teetotumやルーレットのいくつかのフォームは、これらに好適であるが、サイコロは、すべてのよりも優れています。かごに入れて振り回すと、お互いに、またはバスケットのrib骨にさまざまにぶつかりますので、乱暴に転がります。最初の位置では、単一の良いシェイクとトス。ダイスが与える可能性は、一般に想定されているよりもさまざまです。私が示すように、各面には利用できる4つのエッジがあるため、6つだけでなく24の等しい可能性があります。

Galton が正常な逸脱のシーケンスを迅速に生成できることが重要でした。各ロールの後、Galtonはタッチだけでサイコロを並べ、前端に沿ってスコアを記録します。彼は最初に、De Forestのカードによく似ているが100分位ではなく24個のクォンタイルを使用して、エッジが通常の半分の逸脱であるタイプIのいくつかのサイコロを転がします。最大の逸脱(実際にはタイプIのサイコロで空白としてマークされている)の場合、彼はシーケンス内のスペースを埋めるのに必要なだけ、より繊細なタイプIIのサイコロ(より細かい卒業でのみ大きな逸脱を示した)を転がします。 。半正規から通常の偏差に変換するには、彼はダイスIIIを振って、を割り当てます。+114

ゴールトンの通常のサイコロのデザイン

Raazesh Sainudiinの数学統計実験室には、ニュージーランドのカンタベリー大学の学生プロジェクトがあり、Galtonのサイコロを再現しています。このプロジェクトには、サイコロを何度も転がすことによる実証的調査(心強い「正常」に見える経験的CDFを含む)と、標準の正規分布に従うようにサイコロスコアを調整することが含まれます。Galtonの元のスコアを使用して、ダイススコアが実際にたどる離散化正規分布のグラフもあります。

ゴールトンダイスの離散分布


大規模に、「機械」を電気に引き伸ばす準備ができている場合、RANDの叙事詩である100,000の標準偏差を持つAミリオンランダムディジットはルーレットホイールの一種の電子シミュレーションに基づいていることに注意してください。以下からの技術レポート(ジョージ・W・ブラウン、もともとは1949年6月によって)私たちが見つけます:

このように動機付けられたRANDの人々は、Douglas Aircraft Companyのエンジニアリング担当者の支援を受けて、Cecil Hastingsによる提案のバリエーションに基づいてエレクトロルーレットホイールを設計しました。この講演では、簡単な説明で十分です。ランダム周波数パルス源は、1秒に約1回、平均で約100,000パルスを提供する一定周波数パルスによってゲート制御されました。パルス標準化回路は、パルスを5桁のバイナリカウンターに渡しました。したがって、原則として、マシンは32ポジションのルーレットホイールのようであり、各ターンで平均約3000回転します。2進数から10進数への変換が使用され、32桁のうち12桁が破棄され、結果のランダムな数字がIBMパンチに送られ、ランダムな数字のパンチされたカードテーブルが生成されました。

χ2奇数桁と偶数桁の頻度のテストにより、一部のバッチにわずかな不均衡があることが明らかになりました。これは一部のバッチでは他のバッチよりも悪化し、「調整から1か月以内にマシンが停止していました...このマシンの兆候は、先端を維持するために過度のメンテナンスが必要でした」。ただし、これらの問題を解決する統計的な方法が見つかりました。

この時点で、元の数百万桁、1枚のカードに50桁の20,000枚のIBMカードがあり、統計分析によって明らかにされた小さいながらも知覚可能な奇偶バイアスがありました。奇数と偶数のバイアスを取り除くために、少しルーレットを使ってテーブルを再ランダム化するか、少なくとも変更することにしました。各カードの数字を、数字ごとに、前のカードの対応する数字に追加しました(mod 10)。100万桁の派生テーブルは、その後、さまざまな標準テスト、周波数テスト、シリアルテスト、ポーカーテストなどにかけられました。これらの100万桁は、健全な手形があり、RANDの最新のランダムな数字テーブルとして採用されています。

もちろん、追加プロセスが何らかの利益をもたらすと信じる正当な理由がありました。一般的な方法では、基礎となるメカニズムは、無制限のランダム変数の合計が正常に近づくのと同じように、長方形分布の単位区間を法とするランダム変数の合計の制限アプローチです。この方法は、州間商取引委員会のホートンとスミスが、ひどく非乱数の大きなバッチから明らかに乱数の良いバッチを取得するために使用されています。

[01]あなたは[01]FF1あなたは

半正規のジグラット

参照資料

  • バジャー、L。(1994)。「πのラザリーニのラッキー近似」。数学マガジン。アメリカ数学協会。67(2):83–91。

  • ダーウィン、GH(1877)。「可変量の誤りのある測定、および気象観測の処理について。Philosophical Magazine4(22)、1–14

  • デフォレスト、EL(1876)。シリーズの補間と調整。タトル、モアハウス、テイラー、ニューヘブン、コネチカット。

  • ゴールトン、F。(1890)。「統計実験のサイコロ」。自然42、13-14

  • スティグラー、SM(1991)。「19世紀の確率的シミュレーション」。統計科学6(1)、89-97。


「ランダムな数字を生成する算術的方法を考えている人は、もちろん罪の状態にあります。何度か指摘されているように、乱数などはありません。乱数を生成する方法しかありません。 、そしてもちろん厳密な算術手続きはそのような方法ではありません。」


5
あなたは(本当にだが、ええ、冗談...でなければなりません手動 +1)
nalzok

8
これにはどれだけの労力がかかりますか!
リチャードハーディ

3
非標準のサイコロは不公平になる可能性があるため、最初にテストすることをお勧め
Tim

2
@RichardHardy逆説的に、頭の中で持ち歩くよりも、目の前にあるものをすべて書き留めて、少なくとも一時的に記憶に留める方が実際に簡単です!
シルバーフィッシュ

2
いずれにせよ、私はそれが印象的だと思います!
リチャードハーディ

44

非常に正確な時計にアクセスできる場合は、現在の時刻の小数部分を抽出してそれを均一に変換し、そこからBox-Müller変換によって通常のシミュレーションを導出できます。

バツ=2ログうん1cos2πうん2
(そしてさらに2つ Y=2ログうん12πうん2 から独立した別の正規変量 バツ)。

たとえば、Linux OSでは、次のことを確認できます。

$ date +%s.%N
1479733744.077762986
$ date +%s.%N
1479733980.615056616

したがって設定

うん1=.077762986 うん2=.615056616
そして バツ として
> sqrt(-2*log(.077762986))*cos(2*pi*.615056616)
[1] -1.694815

補遺:対数と余弦の計算は十分に手動ではないと見なされる可能性がある ため、Box-Müllerにはこれらの超越関数の使用を回避するバリアントが存在します(本書Monte Carlo Statistical Methodsの課題2.9を参照 )。

Box-Mullerのバリアント

これで、指数変量があるため、このバージョンに反論することができます。しかし、Luc DevroyeのNon-uniform Random Variatesから複製されたこのアルゴリズムに要約されているように、フォンノイマンにより、超越関数を呼び出さずにこれらの変量をシミュレートする非常に賢い方法も存在します

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

確かに、1 / eの計算が必要ですが、一度だけです。

このクロックにアクセスできない場合は、このユニフォームジェネレーターを、多数のユニットスクエアのあるサーフェスにダーツを投げるようなメカニズムユニフォームジェネレーターに置き換えることができます。012 または単位間隔でボールを転がす 01[トーマスベイズの概念的なビリヤードの実験のように]十分なバウンスがある場合、または単位幅の厚板のある木製の床にマッチを投げ、最も近い左端の間隔までの距離をカウントする(Buffonの実験の場合) 1を最小にし、結果の角度1を開始方向で均一に変える02π ドロー。

CLT使用して正規性を概算すること、(1)平均値を供給するために他の変量が必要なので、Box-Müllerアルゴリズムでユニフォームを使用することもできます。シミュレーションの数でゆっくり。特に、サイコロの結果のような離散ランダム変数を使用している場合、6面超える場合でもです。Thomasらからの引用(2007)、ガウスランダムジェネレーターの長所と短所に関する調査:

もちろん、中心極限定理は「近似」法の例です。たとえ完全な算術が使用されたとしても、有限のKに対しては出力はガウスになりません。

問題を説明するための簡単な実験を次に示します。私は、30のダイスの結果の平均の100倍を生成しました。

dies=apply(matrix(sample(1:6,30*100,rep=TRUE),ncol=30),1,mean)

次に、それらの平均を平均ゼロ-分散1変量に正規化します

stdies=(dies-3.5)/sqrt(35/12/30)

そして、このサンプルの通常のフィット感(またはその欠如)を見ました:

qqnorm(stdies、col = "gold2"、pch = 19); abline(a = 0、b = 1、col = "steelblue"、lwd = 2、lty = 2)

1つ目は、特に尾の部分で適合度が高くないことです。2つ目は、明らかに、サンプルによって取得される値の数が恥ずかしいほど有限であることを示しています。(この特定の実験ではdies、との間で76/30との間で34の異なる値しか取られていませんでした122/30。)比較すると、同じ 3000のダイスの結果を利用した場合D 擬似ユニフォームの十分な桁数を作成するには

うん==1kD16
k=15 (6¹⁵>10¹¹なので、11個以上の真にランダムな数字を生成します)、次に上記のBox-Müller変換を適用して、ユニフォームのペアをN(0,1)変量のペアに変換します。
dies=matrix(apply(matrix(sample(0:5,15*200,rep=TRUE),nrow=15)/6^(1:15),2,sum),ncol=2) 
norma=sqrt(-2*log(dies[,1]))*c(cos(2*pi*dies[,2]),sin(2*pi*dies[,2]))

適合は、サイズ200の標準サンプルに対して期待できる限り良好です(真の標準サンプルに対して別のサンプルをプロットするだけですnorma=rnorm(100))。

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

コルモゴロフ-スミルノフ検定でさらに示されるように:

> ks.test(norma,pnorm)

        One-sample Kolmogorov-Smirnov test

data:  norma
D = 0.06439, p-value = 0.3783
alternative hypothesis: two-sided

3

これは厳密にはランダムではありませんが、大まかな実験が必要と思われるので、十分に近いはずです。

電話を使用してクロノメーターをセットアップします。十分な10秒後に停止します(待機するほど真に「ランダムな」結果に近づきますが、10秒で十分です)。最後の数字を入力します(たとえば、10.67秒で67になります)。正規分布にパーセンタイルテーブルを適用します。 この例では、0.67を検索するだけで番号が見つかります。この場合、値は約0.45です。これは完全に正確ではありませんが、確かな推定値を提供します。

50を下回った場合は、100- [Your Result]を実行してテーブルを使用します。N(0,1)の対称性により、結果はマイナス記号付きで同じになります。


3

偏りのないコインを反転させましょう n回。ゼロから始めて、カウントします+1 頭なら 1尾の場合。後n コインが反転し、カウンターを n。使い方中心極限定理をすれば、n が十分に大きい場合、正規化されたガウスの「近似認識」が必要です。 N01


どうして?させて

バツk:={+1 もし k番目のコインフリップは頭です1 もし k番目のコインフリップはテールです

ベルヌーイ確率変数をiidする Pバツk=±1=12。したがって、

Eバツk=0ヴァールバツk=1

させて Y:=バツ1+バツ2++バツn。したがって、

EY=0ヴァールY=n

ノーマライズ、

Z:=Yn

単位分散を持つ確率変数を取得します

EZ=0ヴァールZ=1

1
私の答えで説明したように、CLTはコインフリップのランダム性の効率的な使用ではないことを恐れています。単純または倍精度の擬似ランダムU(0,1)変量の2進数として活用する方が良いでしょう。
西安

@ Xi'an私は私の投稿をする前にあなたの答えを読みましたが、CLTに対するあなたの反対は遅い収束に基づいているようです。これは思考実験であるため、コインを100億回反転させるのに費用はかかりません。そして、それは本当にコンピュータ、対数、平方根または余弦の計算を必要としない手動の手順です。もちろん、スライドルールを使用することもできますが、それは行き過ぎかもしれません。
ロドリゴデアゼベド

1
:}}:100億コインはとても思えないフリップを手動で私に...!
西安

手動=手で。対数と余弦を手で計算するのにも時間がかかります。
ロドリゴデアゼベド

0

uniform(0,1)を生成できたら、一様乱数変数を逆CDFに差し込むだけで、逆累積分布関数が計算可能な任意の確率変数を生成できることに注意してください。

では、どのように手動でuniform(0,1)を計算できますか?さて、@ Silverfishで述べたように、従来のRPGプレーヤーで使用されるさまざまなサイコロがあります。そのうちの1つは10面ダイスです。これが公平なダイであると仮定すると、離散均一(0、9)を生成できます。

このuniform(0,9)を使用して、ランダム変数の1桁を表すこともできます。したがって、2つのサイコロを使用すると、値を取ることができる均一なランダム変数が得られます0.010.020.991.00。3つのサイコロを使用すると、均一な分布を得ることができます0.0010.0020.9991.000

したがって、いくつかの10面のサイコロを使用して、細かくグリッド化された離散均一分布で近似することにより、連続均一(0,1)に非常に近づけることができます。次に、これを逆CDFにプラグインして、目的のランダム変数を生成できます。

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