乱数ジェネレーターのシードとは正確には何ですか?


21

私はいくつかの通常のグーグル検索などを試しましたが、私が見つけた答えのほとんどは、やや曖昧であるか、Python / C ++ stdlib.hなどの言語/ライブラリ固有です。ライブラリに固有ではなく、言語に依存しない数学的な答えを探しています。

例として、多くの人は、シードは乱数ジェネレーターの開始点であり、同じシードは常に同じ乱数を生成すると言います。どういう意味ですか?出力数は特定のシードの決定的な関数であり、ランダム性はシードの値に由来するということですか?しかし、もしそうなら、シードを提供することで、プログラマーは、機械にそれをさせるのではなく、ランダム性を作り出しませんか?

また、この文脈での出発点は何を意味しますか?これは、マップのドメインの要素を言う厳密でない方法ですか?それとも私は何か間違っていますか? F XYxXf:XY


7
答えを書く資格はないと思いますが、メルセンヌ・ツイスターの啓発に関するウィキペディアの記事、特に初期化に関するセクションを見つけるかもしれません。要するに、Mersenne Twisterのような擬似乱数ジェネレーターは、最終的に出力を繰り返します。MTの場合、期間に長さがあり2^19937 − 1ます。シードは、ジェネレータが起動するこの非常に長いシーケンスのポイントです。はい、それは決定論的です。
-IonicSolutions

1
擬似乱数ジェネレータは、無限に繰り返される数字の固定リストです。どこから始まりますか? あなたが言うようになる。
whuber

2
@whuber実際、あなたのコメントは素晴らしい答えになると思います。
デビッドZ

回答:


22

ほとんどの擬似乱数ジェネレーター(PRNG)は、「シード」と呼ばれる入力によって決定されるベース値から始まる何らかの再帰的な方法を含むアルゴリズムに基づいて構築されています。ほとんどの統計ソフトウェア(R、Python、Stataなど)のデフォルトのPRNGは、Mersmoto Twisterアルゴリズム MT19937で、Matsumoto and Nishimura(1998)で設定されています。これは複雑なアルゴリズムであるため、詳細に機能する仕組みを知りたい場合は、このドキュメントを読むのが最善です。この特定のアルゴリズムでは、次数再帰関係があり、入力シードはベクトルの初期セット。このアルゴリズムは、以下を生成する線形回帰関係を使用します。のx 0xは 1x n 1nx0,x1,...,xn1

xn+k=f(xk,xk+1,xk+m,r,A),

ここで、およびおよびは、アルゴリズムのパラメーターとして指定できるオブジェクトです。シードはベクトルの初期セット(およびアルゴリズムのその他の固定パラメーター)を提供するため、アルゴリズムによって生成される一連の擬似乱数は固定されています。シードを変更すると、初期ベクトルが変更され、アルゴリズムによって生成される擬似乱数が変更されます。もちろん、これはシードの機能です。1mnArA

さて、これはMT19937アルゴリズムを使用した単なる一例であることに注意することが重要です。統計ソフトウェアで使用できる多くのPRNGがあり、それぞれが異なる再帰的方法を必要とするため、シードはそれらのそれぞれで(技術用語で)異なることを意味します。あなたはのためのPRNGのライブラリーを見つけることができますR、このドキュメントで使用可能なアルゴリズムおよびこれらのアルゴリズムを説明する論文を示しています、。

シードの目的は、ユーザーが擬似乱数ジェネレーターを「ロック」して、複製可能な分析を行えるようにすることです。一部のアナリストは、ハードウェア入力を使用して初期シード番号を生成し、ロックされた番号として報告する真の乱数ジェネレーター(TRNG)を使用してシードを設定することを好みます。シードが元のユーザーによって設定および報告された場合、監査人は分析を繰り返し、元のユーザーと同じ擬似乱数のシーケンスを取得できます。シードが設定されていない場合、アルゴリズムは通常、ある種のデフォルトシード(たとえば、システムクロックから)を使用し、通常、ランダム化を複製することはできません。


+1。シードを明示的に提供しない場合に(通常)何が起こるかを追加するとよいでしょう。
アメーバは、モニカを復活させる

1
@amoeba:私の回答の4番目の段落では、これについて簡単に説明します。
ブルース

1
これはquestion.itの基本に答えますが、シミュレーションでこれが必要な理由には触れません。真のランダム性を生み出すことは非常に困難です-そしてそれを持っているとき、元の答えを再現することはできません!すべての問題とともにPNRGを入力してください。
ポールパルミエ

@amoeba:要求に応じて、これを具体化するために追加の段落を追加しました。
モニカを

1
ありがとう。「デフォルトシード」は、常にシードのデフォルト値と同じように聞こえます。私が意味したのは、通常、シードはシステムクロックから取得されるということです。これは知っておくと良いと思います。
アメーバは、モニカを復活させる

16

まず、今日のコンピューター生成「乱数」には真のランダム性はありません。すべての擬似乱数ジェネレーターは、決定論的な方法を使用します。(おそらく、量子コンピューターはそれを変えるでしょう。)

難しいタスクは、真にランダムなソースからのデータと有意に区別できない出力を生成するアルゴリズムを考案することです。

シードを設定すると、擬似乱数の長いリスト内の特定の既知の開始点から開始されるのは正しいです。R、Pythonなどで実装されたジェネレーターの場合、リストは非常に長くなります。最大の実行可能なシミュレーションプロジェクトでさえ、ジェネレータの「期間」を超えないため、値のリサイクルが開始されます。

多くの通常のアプリケーションでは、人々はシードを設定しません。次に、予測不能なシードが自動的に選択されます(たとえば、オペレーティングシステムクロックのマイクロ秒から)。一般的に使用されている擬似乱数ジェネレーターは一連のテストにかけられており、主に初期の不十分なジェネレーターではシミュレートすることが困難であることが判明した問題で構成されています。

通常、ジェネレーターの出力は、実際の目的上、上の一様分布から真にランダムに選択された数値と区別できない値で構成されます次に、それらの擬似乱数が操作されるため、二項分布、ポアソン分布、正規分布、指数分布などの他の分布からランダムにサンプリングするものと一致します。(0,1).

ジェネレーターの1つのテストは、としてシミュレートされた 'observations'の連続するペアが実際にランダムに単位正方形を埋めているように見えるかどうかを確認することです 。(下で2回行います。)わずかに霜降りの外観は、固有の変動性の結果です。完全に均一に灰色に見えるプロットを取得することは非常に疑わしいでしょう。[解像度によっては、規則的なモアレパターンが存在する場合があります。その偽の効果が発生した場合は、倍率を上下に変更して削除してください。]Unif(0,1)

set.seed(1776);  m = 50000
par(mfrow=c(1,2))
  u = runif(m);  plot(u[1:(m-1)], u[2:m], pch=".")
  u = runif(m);  plot(u[1:(m-1)], u[2:m], pch=".")
par(mfrow=c(1,1))

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

シードを設定すると便利な場合があります。そのような用途のいくつかは次のとおりです。

  1. プログラミングとデバッグを行う場合、予測可能な出力が便利です。そのため、多くのプログラマーは、set.seed書き込みとデバッグが完了するまで、プログラムの先頭にステートメントを配置します。

  2. シミュレーションについて教えるとき。sampleR の関数を使用してフェアダイスのロールをシミュレートできることを生徒に見せたい場合は、チートし、多くのシミュレーションを実行し、目標の理論値に最も近いものを選択できます。しかし、それはシミュレーションが実際にどのように機能するかという非現実的な印象を与えます。

    最初にシードを設定すると、毎回同じ結果が得られます。学生は私のプログラムのコピーを校正して、意図した結果が得られることを確認できます。その後、独自のシードを使用するか、プログラムに独自の開始位置を選択させることにより、独自のシミュレーションを実行できます。

    たとえば、2つのフェアダイスを振ったときに合計10が得られる確率は、3100万回の2ダイス実験では、2〜3桁の精度が得られるはずです。シミュレーションエラーの95%マージンは約2

    3/36=1/12=0.08333333.
    2(1/12)(11/12)/106=0.00055.
    set.seed(703);  m = 10^6
    s = replicate( m, sum(sample(1:6, 2, rep=T)) )
    mean(s == 10)
    [1] 0.083456         # aprx 1/12 = 0.0833
    2*sd(s == 10)/sqrt(m)
    [1] 0.0005531408     # aprx 95% marg of sim err.
    
  3. シミュレーションを含む統計分析を共有する場合。 現在、多くの統計分析には、置換テストやギブスサンプラーなどのシミュレーションが含まれています。シードを表示することにより、分析を読んでいる人が、必要に応じて結果を正確に複製できるようにします。

  4. ランダム化を含む学術論文を書くとき。学術論文は通常、複数回の査読を経ます。プロットでは、たとえば、ランダムにジッターされたポイントを使用して、オーバープロットを減らします。レビュー担当者のコメントに応じて分析をわずかに変更する必要がある場合は、特定の無関係なジッターがレビューラウンド間で変更されないことが望ましいです。これは、特に気の利いたレビュー担当者を混乱させる可能性があります。


1
とてもいい、+ 1。4番目のポイントを追加する自由を取りました。
S. Kolassa -復活モニカ

擬似ランダム数ジェネレーターは基本的に乱数の周期的なシーケンス([0、1]に均一に分布)を保存し、シードは単にシーケンスのインデックスにすぎないということですか?生成された乱数がシードの決定論的な関数であることを意味しますか?
デラ

9
ランダムジェネレーター(en.wikipedia.org/wiki/Hardware_random_number_generator)を使用するために量子現象を使用するために量子コンピューターは必要ありません
Guiroux

1
@デラ。あなたは本質的に正しい考えを持っています。しかし、実際には「期間」は本当に大きくなければならないことを理解してください。(シミュレーションプロジェクトがどんなに大きくても、繰り返したくありません。)たとえば、IonicSolutionsはQの後に、Mersenne Twilsterジェネレーターの周期がコメントしています。//シードがわかっている場合は、そこから擬似ランダムseqを生成できます。//メッセージの暗号化にはジェネレーターが使用されています。ただし、暗号化用の安全なジェネレーターの標準は、確率シミュレーション用のジェネレーターの標準とは異なります。2199371,
-BruceET

@ギロウ。再量子コンピューターに言及しようとしていた可能性は、今日の擬似乱数ジェネレーターと同じくらい速く真の乱数ジェネレーターを持つことでした。1950年代には、「真の」乱数のソースが実験計画のランダム化と(低速で限定的な)確率シミュレーションに使用されていました。おそらく、Million Random Digitsを参照してください。
ブルース

0

TL; DR;

通常、シードを使用すると、乱数のシーケンスを再現できます。その意味で、それらは真の乱数ではなく「擬似乱数」であり、したがってPNR Generator(PNRG)です。これらは実際の生活の中で本当に助けになります!

もう少し詳細:

コンピューター言語で実装される実質的にすべての「乱数」ジェネレーターは、擬似乱数ジェネレーターです。これは、開始値(===>シード)が与えられると、常に疑似乱数結果の同じシーケンスが提供されるためです。優れたジェネレーターは、統計的には真のランダムシーケンス(真のダイス、真のコインなど)と区別できないシーケンスを生成します。

多くのシミュレーションの場合、真の「ランダム」な体験を望みます。ただし、結果を再現することもできます。どうして?まあ、少なくとも規制当局はその特異なことに興味を持っています。

飛び込むことはたくさんあります。人々は、「最高の」ランダムシードの分析さえ行います。私の意見では、これは「真の」ランダム動作を処理できないため、モデルを無効にします。または、PRNGは実装に適合しません。ほとんどの場合、彼らは十分なシミュレーションを行いませんが、時間がかかります。

「真の」RNGを想像してください。マシンのランダム性に基づいてこれを実装できます。ランダムシード(たとえば、現在の時間)のみを取得する場合は、ランダムな開始点の種類を作成しますが、シーケンスのランダム性は次の数値を決定するアルゴリズムに依存します。結果の分布が実際の「結果」を決定するため、ほとんどの場合、これは開始点よりも重要です。シーケンスを本当にランダムにする必要がある場合、これをどのように実装しますか?コンピューターの時計の刻みは、決定論的であると言え、そうでなければ、おそらく多くの自己相関を示します。だからあなたは何ができますか?これまでの最善策は、しっかりしたPNRGを実装することです。

量子コンピューティング?それが修正されるかどうかはわかりません。

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