php rand()
関数について考えていて、どうすればそれを作り直すことができるかを考えていたところ、来ました。
乱数ジェネレーターはどのように機能しますか?
コメント
回答
実際に乱数を生成することは不可能であるため、乱数ジェネレーター(RNG)は実際に疑似乱数を生成しています。本当にランダムなものは次の行為だけです。神様、稲妻のように。
このウィキペディアの記事は、説明に役立つかもしれません: http://en.wikipedia.org/wiki/Random_number_generators
私が理解していることから、RNGには基本的に2つの部分があります。シードと、そのシードから選択された乱数です。RNGをシードすると、次のようになります。開始poと同等ですint。その開始点には、プログラムが選択するその「内部」にある多数の数値があります。 PHPでは、srand()を使用してシードを「シャッフル」できるため、ほとんどの場合、異なる答えが得られます。次に、rand(min、max)を使用してシードに入り、最小値と最大値の間の数値を選択できます。
警告、可能性のある安っぽいアナロジーを先に!
各「シード」を氷の箱と考え、次に乱数を角氷と考えます。たとえば、1000個のアイスチェストがあり、各チェストの中に1000個のアイスキューブがあるとします。郡フェアでは、飲み物に使用するアイスチェストを選択します。使用できるアイスキューブは1つだけです。ただし、必要なのは1立方インチより大きい角氷だけです。そのため、1000個のチェストの中からランダムにチェストを選択し、次にそのチェスト内の角氷をランダムに選択します。それが彼らが望むサイズで機能する場合、彼らはそれを使用します。そうでない場合は、他の人と一緒に胸に戻します。もう少し楽しくしたい場合は、事前に胸を交換して完全に気づかないようにします。
PHPの方法については実際にシードと乱数を物理的に選択しますが、そのための十分な知識がありません(これはおそらくあなたが最も疑問に思っていたことです!)。 rand()関数をやり直そうとはしません。作成するほとんどのWebベースのアプリケーションでは、必要な乱数に対してrand()で十分です。
線形合同法も確認してください。ジェネレーター、これはあなたが「汚い詳細が必要な場合に探しているものの多くかもしれません: http://en.wikipedia.org/wiki/Linear_congruential_generator
これがお役に立てば幸いです!
コメント
-
god
の動作はどのようにランダムになりますか少しでも?その上、稲妻は'ランダムではなく、さまざまな条件によって決定されるパスをたどります。また、番号を生成する通訳者は本質的に無関係です。 - I '法的な意味で不可抗力を使用しています:en.wikipedia.org/wiki/Act_of_God 人間が明らかに制御できないため、ランダムと見なされます。
- したがって、本質的に、ランダムなものはありません。しかし、それには、一見ランダムに発生するすべての出来事に影響を与える必要があります。これは、時間の最初の段階では機能しません。' I 'いくつかの哲学クラスを受講します= D
- @Korvin、私たちの知る限り、放射性崩壊や励起された原子による光子の放出などの量子現象は本当にランダムです。しかし、数学者や哲学者は、真にランダムであることの意味について議論しています。普通の人はコイントスはかなりランダムだと思っていますが、機敏なステージマジシャン( news.stanford.edu/pr/2004/diaconis-69.html )は定期的にできます10回のフリップで10個のヘッドを獲得します。
- @ Charles-コイントスは'バイナリのヘッド/テールでさえありません、'は実際には頭/尾/端なので、本当に優れたステージマジシャンは頭も尾も下がらないようにすることができます。 * 8 ')
回答
通常は真にランダムではありませんが、ランダムに見える数列を生成するため、疑似ランダムと呼ばれます。これは、いくつかの興味深い数式を使用して行われます。最も一般的なものの1つは、線形一致です。ジェネレーター。
疑似乱数には、真の乱数にはない便利なプロパティが1つあります。開始時に同じシードを使用すると、同じシーケンスが返されます。これは、テストに非常に便利です。
コメント
- ' 2番目のステートメントを正しく理解している場合:
random(5332)
は常にrandom(5332)
? - @Korvinと等しくなります。つまり、
srand(5332)
その場合、rand
によって返される次の番号は常に同じになります。 - "はランダムに表示されます"->は真の乱数と同じ統計的特性を持っています。
- LGCWikipediaリンクの+1、これは優れた多次元モンテカルロシミュレーションを実行するときに単純PRNGに重大な制限がある理由のアニメーション。
回答
Are y疑似ランダムまたはランダムを求めていますか?他の人は疑似乱数について答えました、ランダムについて話させてください。
実際のハードウェアベースの乱数ジェネレータが販売されていました(ありますか?)。それらは、深宇宙放射線のホワイトノイズを測定する小さな無線機を備えたチップ、または小さな放射性サンプルとその崩壊の間の期間を測定するチップに基づいていました。それらの問題は帯域幅でした。生成できるエントロピーの量はそれほど多くなかったため、疑似ランダムアルゴリズムのシードに使用されました。銀行システム、高セキュリティなどで使用されました。
OTOH、組み込みシステムの開発者に会うと、彼らはこれらを笑うでしょう。マイクロコンピュータのプログラミングにおける一般的な目的のために、フローティング(接続されていない)ピンを備えた16ビットのアナログデジタルコンバータの下位4ビットを読み取ると、完全に良い結果が得られます。ランダムノイズ、十分な帯域幅(ポーリング期間が短いほど読み出しが「ノイズ」が多い)で、実際のRNGルーチンを作成するよりも簡単です。ADCを考慮すると、マイクロプロセッサのシリコンに実装され、一般的に実装され、多くの場合、アプリケーションに5つ必要な8つのチャネルは、実質的に無料です。
ADCがない場合でも、デジタルGPIOピンに接続されたいくつかの要素でかなり良い結果が得られます。ノイズ。埋め込みでは、ノイズはevです。 er-present(そして絶えず戦っている)なので、真のランダム性を得るのは非常に簡単です。
回答
多くの方法があります数字の「ランダムな」シーケンスをエミュレートしようとします。最初に立ち寄るのは、確かに線形合同法について読むことです。これが最も基本的な乱数ジェネレーターの動作方法であり、PHPのrand()関数の動作方法だと思います。
次の質問としてさらに興味深いのは、それ自体をどのようにシードするかです。 ?IPアドレス?など
コメント
- シードは私を混乱させるものです、私はできます'なんらかのパターンなしで関数をシードできる可能性のあるものは何も考えないでください。そうでない場合でも、そもそもランダムシードが生成される原因は何ですか。
- タイムスタンプはよくあると思います。他のソースから実際に何も提供されていない場合に初期シードとして使用されます。古いBASICでは、
RANDOMIZE TIMER
が一般的なイディオムであり、" goodほとんどの(暗号化されていない)目的には十分な"です。 man 3 srand によると、GNUCライブラリはPRNGが再シードされるまで1のシードを修正しました。
回答
まず、事実上すべてrand()
関数は真のランダム性を提供せず、いわゆる疑似乱数を提供します。
では、疑似乱数ジェネレーターはどのように機能しますか?基本的に暗号化が機能するのと同じ方法です。入力を受け取り、出力から入力を推測すること、またはその逆が不可能なほど複雑な方法で出力を生成する関数(ハッシュ)があります。すべての暗号を使用して、かなり優れた疑似乱数ジェネレータを作成できます。ただし、原則として任意の疑似乱数ジェネレータを使用して暗号化を行うことができますが、ほとんどの疑似乱数ジェネレータは、暗号化セキュリティではなく、主に速度を重視して開発されているため、ハッカーに頭痛の種を与えることはありません。
疑似ランダムジェネレータの場合、ハッシュ関数はジェネレータの非表示の内部状態に適用され、その出力はa)その内部状態を変更するために使用されます。 b)rand()
関数の出力を計算します。 rand()
を次に呼び出すと、その変更された内部状態が使用されるため、異なる結果が生成されます。ハッシュ関数が優れているほど、結果を真の乱数と区別しにくくなります。
実際のところ、最近のコンピューターは実際の乱数にアクセスできます。これらは、外部デバイスによって生成された割り込みのタイミングのジッターに起因します。 Linuxは、これらの小さな不確実性の値を使用して、わずか数キロバイトの内部状態である「エントロピープール」を絶えず攪拌します。このエントロピープールに基づく暗号化ハッシュは、/dev/random
および/dev/urandom
デバイスを介して利用できます。したがって、いくつかの本当に優れた乱数へのアクセスは、これら2つのデバイスの1つを開いて、それらからいくつかのバイトを読み取るだけです。
回答
乱数は、出力が予測できないプロセスによって生成された番号です。つまり、次の出力がどうなるかわかりません。サイコロの結果の簡単な例をいくつか取り上げることができます。サイコロを投げたときに何が出力されるかは予測できません。
乱数には2つのタイプがあります。1。真の乱数2.疑似乱数。
コメント
- 引用形式を使用して、答えはあなたのものであり、あなたが引用した情報源からのものです。答えがすべて外部ソースからのコピー/貼り付けである場合、'ここでは適切な答えではありません。
- これは'前の6つの回答で作成および説明されたポイントよりも実質的なものを提供していないようです
function rand() { return 4; /* determined by die roll - guaranteed to be random */ }