また、「宝くじ」と「ラッフル」という言葉からあなたの連想は何ですか? 数字と抽選機を備えたマルチカラーのボールがあり、そこからマルチカラーのボールが1つずつ落下し、勝者を決定します。
そのため、しばらく前に、 Otus.ruのコース「Java Developer」の無料の場所の抽選の勝者を「決定」する必要がありました。 タスクは簡単に聞こえました。N通のメールがあります。無料で勉強する人のM通をランダムに選択する必要があります。
タスクの複雑さは、これらがコースの入学試験に合格した全員の電子メールであるということでした。 つまり、メールプログラマーです。 私は自分のポケットからMメールを「引き出し」、「これらが勝った」と言っているのを想像しました。 そして...誰も私を信じていない。 勝者が一般的なチャットで「ありがとう、私たちは幸せです!」と楽しく書き始めたとしても、とにかく残っている人は誰も私を信じないでしょう。 はい、単に「 これらが勝った」と言われたら、私はそれを自分で信じなかったでしょう。

プログラマーが誰が勝ったかを言うだけでは十分ではありません。これらは本当にランダムな勝者であり、彼らのメールが本当に一般リストに載っていること、そして誰もが勝者になる確率が等しいことを証明する必要があります。
このような状況では、場所を再生する方法を把握する必要がありました。 この記事では、この問題に対する私の解決策を提供したいと思います。 私はコメント、特に私の決定の説得力についてコメントすることを嬉しく思います。 あなたのメールが一般的なリストに載っていた場合、結果について合理的に議論しますか?
それで、プログラマーの間で賞品を引く方法:
- 抽選の主催者の選択から削除します。 ロボットが選択する必要があります。
- ロボットを開いて、だれでも選択方法を確認できるようにします。
- ランダム選択を擬似ランダムにします。 シーケンスのシードを知っている人は誰でもそれを繰り返すことができます。
- 同時に、物質のランダム性に擬似ランダム性の粒子を形成する。
- 共有...メール? みんながリストに載るように? いいえ、ユーザーは感謝しません。 しかし、どういうわけかリストに載っていることを確認する必要があります。
最初にやるべきことは、プログラムに選択を委ねることでした。 誰が勝ったかを決める宝くじ機を書きます。 githubの私のアカウントで私の車のコードを見ることができます。
電子メールを読むためのクラス、勝者のインデックスで「ボール」を選択するクラス、すべてを開始するクラスで構成されています。
メールのリストを取得するのは簡単です。 ファイルから読み取る必要があります。 最初はcsvファイルからメールと名前を読みたいと思っていましたが、メールだけを残し、csvとそれを読み込むライブラリは残りました。
メールを読んだ結果-リスト宝くじ機に渡します。 さらに、彼女は入り口で勝者の数を受け取ります。 また、彼女にはシードを与えることもできます-擬似ランダムシーケンスのシード。 数値または文字列で指定できます。 2番目の場合、グレインは文字列からハッシュされます。
シードがある場合、宝くじ機は各開始時に同じ「ランダムな」勝者のシーケンスを提供します。 ランダムだが疑似。 実際、これが必要なものです。
さて、電子メールのリストがあり、宝くじマシンがあり、その作業でjava.util.Randomクラスを使用します。これにより、シードに基づいた擬似ランダムシーケンスが得られます。
さて、成功のために、単純なものが欠けています。ランダムシード-一貫性の粒。 ランダムでしたが、覚えておくことができました。 私は、チャットの内容をそのようなマテリアルのランダム性のソースとして使用することにしました。 最後のいくつかのメッセージをマシンに転送して、マシン自体のシードを計算します。
集会に来た人は誰でもいつでもチャットに書き込むことができました。 ハッシュ定義に一致するようにチャットメッセージを偽造しますか? これを行う方法がわかりません。 さらに、マシンを起動する直前にチャットで何かを書きたい人に尋ねました。
どうでしたか、 youtubeのオープンドアエントリで確認できます。
宝くじ機を発売し、当選者を獲得しました。 その後、彼らは再びそれを起動し、同じものを得た。
その後、テキストを変更することを提案し、最後のメッセージを削除しました。 「今、この最後のコメントが結果にどのように影響したかを見てみましょう」という言葉で、私は車を始めました。結果の中には、この最後のコメントを書いた人のメールがありました。 彼がそれを書かなかったならば、彼は賞を得るでしょう。 もちろん彼はそれに気づきました。 もちろん、私たちは皆それに気づきました。 そして受賞者は、ギフトに対するコメントの著者に感謝しました。
もちろん、メールをgithubにアップロードしませんでした。 ただし、リポジトリでは、「難読化された」電子メールが記録されているファイルを見ることができます。
そして、プログラマーの間でどのように賞を獲得しますか? 機械のコードと動作原理は明確ですか?