私はちょうどphp rand()
関数について熟考し、それをどのようにリメイクできるかを考えていたところ、完全にばかげて思いつきました。
乱数ジェネレーターはどのように機能しますか?
function rand() { return 4; /* determined by die roll - guaranteed to be random */ }
私はちょうどphp rand()
関数について熟考し、それをどのようにリメイクできるかを考えていたところ、完全にばかげて思いつきました。
乱数ジェネレーターはどのように機能しますか?
function rand() { return 4; /* determined by die roll - guaranteed to be random */ }
回答:
乱数ジェネレーター(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
お役に立てれば!
god
少なくともランダムにランダムになりますか?その上、稲妻もランダムではなく、さまざまな条件によって決定される経路をたどります。また、番号を生成するインタープリターは本質的に無関係です。
通常、それらは真にランダムではありませんが、ランダムに見える数列を生成するため、疑似ランダムと呼ばれます。これは、いくつかの興味深い数式で行われます。最も一般的なのは、線形合同ジェネレーターです。
擬似乱数には、真の乱数にはない便利な特性が1つあります。起動時に同じシードを使用すると、同じシーケンスが返されます。これはテストに非常に便利です。
srand(5332)
場合、返される次の番号rand
は常に同じになります。
擬似ランダムまたはランダムを要求していますか?他の人は擬似ランダムについて答えました。ランダムについて話させてください。
実際にハードウェアベースの乱数ジェネレータが販売されていました。それらは、深宇宙放射線のホワイトノイズまたは小さな放射性サンプルを測定し、その崩壊までの期間を測定する小さなラジオを備えたチップに基づいていました。それらの問題は帯域幅でした-それらが生成できるエントロピーの量はあまり高くなかったので、それらは擬似ランダムアルゴリズムのシードに使用されました。銀行システム、高度なセキュリティなどで使用されていました。
OTOH、組み込みシステムの開発者に会うと、彼らはこれらを笑います。マイクロコントローラのプログラミングの一般的な目的で、フローティング(未接続)ピン以外の16ビットA / Dコンバータの下位4ビットを読み取ると、十分な帯域幅で完全に良好なランダムノイズが生成されます(ポーリング期間が短いほど、ノイズの多い」読み取り)、実際のRNGルーチンを記述するよりも簡単です。また、ADCは一般にマイクロコントローラのシリコンに実装され、一般に実装され、多くの場合、アプリケーションに5つ必要な8チャネルで実装されていることを考慮すると、実質的に無料です。
そして、たとえADCを持っていなくても、デジタルGPIOピンに接続されたいくつかの要素はかなり良いノイズを生成します。組み込みでは、ノイズが常に存在する(そして常に戦っている)ため、真のランダム性を得るのは非常に簡単です。
「ランダムな」数列をエミュレートしようとする方法はたくさんあります。最初の目的は、線形合同発生器について読むことです。これが最も基本的な乱数ジェネレーターの動作方法であり、PHPのrand()関数の動作方法だと思います。
熟考するためのより興味深い次の質問は、それがどのように種をまくかです。時間?IPアドレス?等
RANDOMIZE TIMER
、一般的なイディオムであり、ほとんどの(暗号化されていない)目的には「十分」です。man 3 srandによると、GNU CライブラリはPRNGが再シードされるまで1の固定シードを使用します。
まず第一に、事実上すべてのrand()
関数は真のランダム性を提供するのではなく、いわゆる擬似乱数を提供します。
それでは、擬似乱数ジェネレータはどのように機能しますか?基本的に暗号化と同じように:入力(入力)を受け取り、出力から入力を推測すること(またはその逆)が不可能な複雑な方法で出力を生成する関数(ハッシュ)があります。つまり、すべての暗号を使用して、かなり優れた疑似乱数ジェネレーターを作成できます。ただし、擬似乱数ジェネレーターを使用して原則として暗号化を行うことができますが、ほとんどの擬似乱数ジェネレーターは暗号化セキュリティではなく速度のために主に開発されているため、ハッカーに頭痛の種を与えません。
擬似乱数ジェネレーターの場合、ハッシュ関数はジェネレーターの隠された内部状態に適用され、その出力はa)その内部状態を変更し、b)rand()
関数の出力を計算するために使用されます。の次の呼び出しでrand()
は、変更された内部状態が使用されるため、異なる結果が生成されます。ハッシュ関数が優れているほど、結果が真の乱数と区別されにくくなります。
実際のところ、今日のコンピューターは実際の乱数にアクセスできます。これらは外部デバイスによって生成された割り込みのタイミングのジッターに起因します。Linuxはこれらの小さな不確実性の値を使用して、数キロバイトの内部状態である「エントロピープール」を絶えず攪拌します。このエントロピープールに基づく暗号化ハッシュは、/dev/random
および/dev/urandom
デバイスを介して利用できます。したがって、非常に優れた乱数へのアクセスは、これら2つのデバイスのいずれかを開き、そこからいくつかのバイトを読み取るのと同じくらい簡単です。