週末の夜、Linuxの上司は、すべての参加者のために一緒にすべてのハードウェア、CPU、メモリ、ハードディスク、およびgitの、vimの、ブラウザ、C、Javaおよびその他のソフトウェアをもたらすために、会議の緊急通知を発行しました。
あなたが謝罪邪魔する夜のボスは、春祭りが来て表現し、その時は誰もが十分に休息を持たせ、その後、中心的なテーマになります:人類は、私たちが行うにはどのように「ロールサイコロ」を、学ぶことが必要?
メモリは驚きを表明:なぜ?私たちは、遊びにギャンブルをしたいですか?ここでは、サイコロを何もすることができます!
Linuxのボス:実際には、サイコロのではない本当のロールは、非常に汎用性の高い乱数、私たちのコンピュータで乱数を生成するキーを生成、通信、塩を形成することである(塩)......人々が手動操作に行くことを期待することはできません。
Vimは笑った:乱数を生成しますか?私はライン上でvimの初心者やめるように、それは、とても簡単です。
Linuxのボス:なぜ?
VIM:新参者はVimを終了する方法がわからないので、ハハ、それはまだ乱数を形成していない非常にランダムなパス、によってランダム盲目のだろうか?!
CPUガンプ:このジョーク寒いのに十分な!
(CPUフォレストは、学生を知らない、会場は「缶CPUフォレストガンプ」)
Linuxのボス:vimの口頭での警告、少し深刻な、乱数生成は非常に重要なことである、人間の要件:
1. 無秩序へ
図2は、 予測できない乱数が生成されているによらず、推定次の乱数が有効です、
3. 再生できない、正確に同じ乱数列と列の数を再生することができません
ここで聞いて、我々十分に高いが必要で、すべての吸入空気、!サイコロを通じて人間は、この要件を満たすことができますが、アルゴリズムと手順は、コンピュータによって決定され、これをどのように行うには?
C老人は言った:私は、プログラムを言及し、私は人間が合同アルゴリズム線形と呼ばれるもののアルゴリズムを、持っていることを聞いて、乱数を生成するように思われます。
C老人は式を書きました:
CPUとメモリリコールフォレストは、再帰関数呼び出しを投げる、と彼は言った:「私は再帰的なめまいを見ました。」
C老人は言った:このアルゴリズムは非常に単純である、A、C、Mの整数を慎重に選択され、乱数を生成する前に、ユーザは、最初に選択したシード(SEED)をシードとして現在のタイムスタンプで、例えば、我々そう= 11、C = 5、すなわち、実験を行う簡単なデジタル M = 13、シード= 15
「ルックは、非常にランダムではありません!」C老人非常に誇りに思って。
「私はjava.util.Randomの間にそれを置く、このアルゴリズムは良い結果で、非常に単純なことですが、私はそれを実現しました。」:Javaは、言いました
Cは、老人は言った:「私は私の機能srand関数とのrand関数を置く.srand 『シード』を設定するために使用され、ランドは、次の乱数を取得するために使用しました。」
srand((unsigned) time(&t));
// 输出5个随机数
for(int i=1 ;i<=5; i++){
printf("%d\n", rand());
}
Javaは言った:「ルック、またはオブジェクト指向まあ、私のランダムクラスは、内部の状態をカプセル化し、ユーザーが唯一の種子に(も渡しません、私はそれがデフォルトに設定されている)を渡す際にランダムなオブジェクトを作成する必要があり、それにnextInt()メソッド。シンプル以上! "
Random r = new Random();
for(int i=1; i<=5; i++){
System.out.println(r.nextInt());
}
Cは独善老人は、Java、CPUフォレストガンプと話す反撃しようとしていました:「いいえ、ああ、乱数あなたは私たちのボスああの要件を満たしていないが、これは擬似乱数である真の乱数ではありません!」
C老人はすぐに彼フォレストガンプに彼らの注意を回した:「なぜ、これは擬似乱数であると言います?」
CPUフォレストは言った:「ボスは予測不可能に、言ったが、あなたのこの公式、私は乱数で、自分自身が式に代入次の乱数が出て計算することができることを知っているならば、私の代わりに、ミリ秒完全に予測不可能。」
フォレスト発言は、彼のスピードは、コンピュータシステム全体の最速で、真実です。
「そして、あなたは実際に現在の時刻の種で行う、その後、私は時間の同じ種を行い、それが乱数を生成し、あなたとまったく同じキューすることが可能になる?ああ再現することができます。」
Cは、老人は、連続する2も言葉不平、その失うが、苦しみました。
Linuxのボスは、以上の事を滑らかにするために急いで:「それは疑似乱数だったが、このアルゴリズムは、非常に簡単です、このようなゲームをプレイするとき、まだにとって非常に有益であるとして以下の状況を、厳しいこれらのセキュリティに私たち、その後、真にランダム生成する方法を考えます。それは多くの!」
C老人は言った:いずれかの方法では、我々は、ハッシュ関数を使用することができます。
R1 =ハッシュ(シード)
種子=種子+ 1
R2 =ハッシュ(シード)
種子=種子+ 1
R3 =ハッシュ(シード)
種子=種子+ 1
R4 =ハッシュ(シード)
......
CPUフォレストは言った:「このメソッドは大丈夫です、あなたは私を与えた乱数下シード(種子)を知らなくても、私は次のいずれかを予測することはできない、乱数は、ハッシュ関数によって生成されるので、一方通行でありますプロセス。しかし、私は、種子を知って、その後、あなたは正確に同じ乱数列を生成することができれば、それは自然の中で「非再現性」を満たしていません。」
誰もが黙っていた、あまりにもハード真の乱数を生成するようです。
長い時間の後、vimの突然彼は言った:私はあなたが言ったと思った冗談ですが、アイデアはああ学ぶことができるのですか?私たちは考えよう
ユーザーのキーストロークのスピードテンポがランダムではありませんか?
ユーザーのマウスの動きはランダムではありませんか?
2番目のネットワークカードごとに送信されるデータの量はランダムではありませんか?
データは毎秒ディスクに書き込まれるランダムではありませんか?
私たちは一緒にこれらのランダムなものを入れる場合は......
非常に満足のLinuxボス:「周囲の騒音マシンが実行されているようはい、私たちはそれらを参照することができ、私は......彼らがプールに集め入れ」
CPUフォレストはすぐインタフェース:「次に、あなたがメッセージダイジェストになるこの池のハッシュアルゴリズムを使用することができ、その結果は、予測できない、真の乱数厄介である再現することはできません!」
あまりにも両方の男性は信用をつかむだろうと、少し不快に感じるVIM。
また、うなずいたC老人:「このアプローチは素晴らしいああ、私は値を得るために、私rand関数を変更することができます......」
Linuxのボス:「ただ、言っDOは、あなたはまだ先週、擬似乱数を維持したくない、農民が公共のコード番号を裏返しすべてがファイルである、私はと呼ばれる特殊なファイルを生成することができます/をDEV /ランダムそれ、プログラマので、あなたはコールする最も一般的に使用されるオープン、読み、他の方法を使用することができます! "
Linuxのボスは、悲しい文を終えた:「最後に、私たちはサイコロを学びます!。」
1日の後。
CPUフォレストは興奮し、Linuxのボスを探して来た:上司が、昨日は一つのことを忘れて、私は真のハードウェア乱数生成をサポートする、ああ、私は熱雑音耐性を生成するために使用することができ、真の乱数である、とRdRand命令を得ることができます。
Linuxのボス:あなたが移植されるために生まれてきたときに、このハードウェアであり、NSAは、バックドアの内側に取り付けられている場合はどのように行う、ブラックボックスのですか?
CPUフォレストはショックを受け、彼の体を見て......