乱数ジェネレーターはどのように機能しますか?


23

私はちょうどphp rand()関数について熟考し、それをどのようにリメイクできるかを考えていたところ、完全にばかげて思いつきました。

乱数ジェネレーターはどのように機能しますか?


2
擬似乱数ジェネレーターは、シード、事前定義された定数と数式のテーブルを使用します。実際の乱数ジェネレーターは、通常大気ノイズを使用します。/ dev / randomを読み取ることで、簡単に乱数を取得できます。
右折

大気ノイズはランダムであることが保証されていますか?


14
function rand() { return 4; /* determined by die roll - guaranteed to be random */ }
ニール

3
誰かがこれをしなければなりません:xkcd.com/221 ;)
Valera Kolupaev

回答:


7

乱数ジェネレーター(RNG)は実際に擬似乱数を生成しています。これは、実際にTRULY乱数を生成することは不可能だからです。本当に本当にランダムなものは、雷のような神の行為だけです。

このウィキペディアの記事は、説明に役立つ場合があります:http : //en.wikipedia.org/wiki/Random_number_generators


私が理解していることから、RNGには基本的に2つの部分があります。シードと、そのシードから選択された乱数です。RNGをシードすると、開始点に相当するものが与えられます。その開始点には、プログラムが選択する「内部」の数字の束があります。PHPでは、srand()を使用してシードを「シャッフル」することができるため、ほとんどの場合、別の答えが返されます。次に、rand(min、max)を使用してシードに入り、minとmaxの間の数値を選択します。


警告、可能性のある安っぽいアナログが先に!

それぞれの「シード」をアイスチェストと考え、次に乱数をアイスキューブと考えてください。1000個のアイスチェストがあり、各チェストの内部に1000個のアイスキューブがあるとします。郡フェアでは、飲み物用のアイスチェストを選択し、アイスキューブは1つしか使用できません。ただし、必要なのは1立方インチより大きいアイスキューブだけです。そのため、彼らはこれらの1000個のチェストの中からランダムにチェストを選択し、そのチェストの中にアイスキューブをランダムに選択します。必要なサイズで機能する場合は、それを使用します。そうでない場合は、他の人と一緒に胸に戻します。彼らがそれをもう少し楽しくしたいなら、あなたは完全に忘却のために事前に胸を変えます、あなたはそうするでしょう!

PHPが実際にシードと乱数を実際にどのように選択するかについては、そのための十分な知識がありません(おそらくあなたが最も疑問に思っていることでしょう!)。rand()関数をやり直そうとはしません。作成するほとんどのWebベースのアプリケーションでは、rand()で必要な乱数を取得できます。

また、線形合同ジェネレーターを確認してください。これは、汚れた詳細が必要な場合、あなたが探しているものの多くかもしれません:http : //en.wikipedia.org/wiki/Linear_congruential_generator

お役に立てれば!


7
どんな行為がgod少なくともランダムにランダムになりますか?その上、稲妻もランダムではなく、さまざまな条件によって決定される経路をたどります。また、番号を生成するインタープリターは本質的に無関係です。

7
私は法的な意味で神の行為を使用しています:en.wikipedia.org/wiki/Act_of_God 彼らは明らかな人間の制御を超えているため、ランダムと見なされます。

4
本質的に、ランダムなものは何もありません。しかし、そのためには、一見ランダムな出来事すべてに影響を与える必要があります。これは、時間の最初に到達すると機能しません。...哲学のクラスを受講するように見えます= D

6
@Korvinは、私たちが知る限り、放射性崩壊のような量子現象、または励起された原子による光子の放出は本当にランダムです。しかし、数学者や哲学者は、真にランダムであるとはどういうことかを主張します。また、普通の人はコイントスはかなりランダムだと考えていますが、アジャイルステージマジシャン(news.stanford.edu/pr/2004/diaconis-69.html)は10回のフリップで10個のヘッドを定期的に獲得できます。
チャールズE.グラント

1
@Charles-コイントスは、バイナリのヘッド/テールでもありません。実際にはヘッド/テール/エッジなので、本当に優れたステージのマジシャンは、ヘッドでもテールでも落ちません。* 8 ')
マークブース

18

通常、それらは真にランダムではありませんが、ランダムに見える数列を生成するため、疑似ランダムと呼ばれます。これは、いくつかの興味深い数式で行われます。最も一般的なのは、線形合同ジェネレーターです。

擬似乱数には、真の乱数にはない便利な特性が1つあります。起動時に同じシードを使用すると、同じシーケンスが返されます。これはテストに非常に便利です。


2番目のステートメントを正しく理解している場合:random(5332)常に等しいrandom(5332)ですか?

2
@Korvin、いいえ、あなたが電話したsrand(5332)場合、返される次の番号randは常に同じになります。
マークランサム

3
「ランダムに表示されます」->真の乱数と同じ統計特性を持ちます。

LGC Wikipediaリンクの+1。これは、多次元のモンテカルロシミュレーションを実行するときに、simplt PRNGに重大な制限がある理由を示す優れたアニメーションです。
マークブース

4

擬似ランダムまたはランダムを要求していますか?他の人は擬似ランダムについて答えました。ランダムについて話させてください。

実際にハードウェアベースの乱数ジェネレータが販売されていました。それらは、深宇宙放射線のホワイトノイズまたは小さな放射性サンプルを測定し、その崩壊までの期間を測定する小さなラジオを備えたチップに基づいていました。それらの問題は帯域幅でした-それらが生成できるエントロピーの量はあまり高くなかったので、それらは擬似ランダムアルゴリズムのシードに使用されました。銀行システム、高度なセキュリティなどで使用されていました。

OTOH、組み込みシステムの開発者に会うと、彼らはこれらを笑います。マイクロコントローラのプログラミングの一般的な目的で、フローティング(未接続)ピン以外の16ビットA / Dコンバータの下位4ビットを読み取ると、十分な帯域幅で完全に良好なランダムノイズが生成されます(ポーリング期間が短いほど、ノイズの多い」読み取り)、実際のRNGルーチンを記述するよりも簡単です。また、ADCは一般にマイクロコントローラのシリコンに実装され、一般に実装され、多くの場合、アプリケーションに5つ必要な8チャネルで実装されていることを考慮すると、実質的に無料です。

そして、たとえADCを持っていなくても、デジタルGPIOピンに接続されたいくつかの要素はかなり良いノイズを生成します。組み込みでは、ノイズが常に存在する(そして常に戦っている)ため、真のランダム性を得るのは非常に簡単です。


2

「ランダムな」数列をエミュレートしようとする方法はたくさんあります。最初の目的は、線形合同発生器について読むことです。これが最も基本的な乱数ジェネレーターの動作方法であり、PHPのrand()関数の動作方法だと思います。

熟考するためのより興味深い次の質問は、それがどのように種をまくかです。時間?IPアドレス?等


シードは私を混乱させるものであり、何らかのパターンなしで関数をシードできる可能性があるものは考えられません。

3
他のソースから実際に何も提供されない場合、タイムスタンプは最初のシードとしてよく使用されると思います。古いBASICではRANDOMIZE TIMER、一般的なイディオムであり、ほとんどの(暗号化されていない)目的には「十分」です。man 3 srandによると、GNU CライブラリはPRNGが再シードされるまで1の固定シードを使用します。
CVn

1

まず第一に、事実上すべてのrand()関数は真のランダム性を提供するのではなく、いわゆる擬似乱数を提供します。

それでは、擬似乱数ジェネレータはどのように機能しますか?基本的に暗号化と同じように:入力(入力)を受け取り、出力から入力を推測すること(またはその逆)が不可能な複雑な方法で出力を生成する関数(ハッシュ)があります。つまり、すべての暗号を使用して、かなり優れた疑似乱数ジェネレーターを作成できます。ただし、擬似乱数ジェネレーターを使用して原則として暗号化を行うことができますが、ほとんどの擬似乱数ジェネレーターは暗号化セキュリティではなく速度のために主に開発されているため、ハッカーに頭痛の種を与えません。

擬似乱数ジェネレーターの場合、ハッシュ関数はジェネレーターの隠された内部状態に適用され、その出力はa)その内部状態を変更し、b)rand()関数の出力を計算するために使用されます。の次の呼び出しでrand()は、変更された内部状態が使用されるため、異なる結果が生成されます。ハッシュ関数が優れているほど、結果が真の乱数と区別されにくくなります。


実際のところ、今日のコンピューターは実際の乱数にアクセスできます。これらは外部デバイスによって生成された割り込みのタイミングのジッターに起因します。Linuxはこれらの小さな不確実性の値を使用して、数キロバイトの内部状態である「エントロピープール」を絶えず攪拌します。このエントロピープールに基づく暗号化ハッシュは、/dev/randomおよび/dev/urandomデバイスを介して利用できます。したがって、非常に優れた乱数へのアクセスは、これら2つのデバイスのいずれかを開き、そこからいくつかのバイトを読み取るのと同じくらい簡単です。


-2

乱数は、出力が予測不可能なプロセスによって生成される番号です。すなわち、次の出力がどうなるかわかりません。サイコロの簡単な結果をいくつか取ることができます。サイコロを投げると何が出力されるかは予測できません。

乱数には2つのタイプがあります。真の乱数2.擬似乱数。

乱数の生成方法


1
引用形式を使用して、回答のどの部分があなたのもので、どの部分が引用元のものであるかを強調してください。あなたの答えがすべて外部ソースからのコピー/貼り付けだけである場合、ここでは良い答えではありません。
マット

これは作られたポイントを超える大幅な提供の何にも思えるし、前6つの回答で説明していません
ブヨ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.