Toolz の立ち上げのために小さなプレゼント企画を実行しましたが、私は怠惰な方法で抽選を行いました。参加者リストをスプレッドシートに貼り付け、 の列を追加しました =RAND()、そしてそれによって並べ替えられた。 それはうまくいったが、生計のために統計を行う友人は私の肩越しに見て言った、 " あなたはそれが実際には均一ではないことを知っていますよね? " 彼は正しかった、そして私がその夕方に落ちたウサギの穴は、なぜToolzが今適切なものを持っているのかの大きな部分を占めています リストランダマイザー それは正しい方法でシャッフルします このガイドは私が学んだもので、帽子から名前を引き出す必要があり、帽子が正直であることを望む人のために書かれています。
tl;dr: リストランダマイザーは、リスト全体をランダムに並べ替えるか(シャッフル)、そこからランダムなサンプルを描画する(ピック)。良いものはフィッシャーイェーツシャッフルと暗号ランダムソースを使用するため、すべての注文の可能性は同等です。ターン注文と座席にはシャッフルを使用し、景品とサンプルにはピックを使用します。このツールはクライアント側で実行され、デフォルトで置換なしで描画されるため、勝者は一意であり、リストが保持するよりも多くの一意のアイテムを描画することを拒否します。
私はLaravelとReactでSaaS製品を構築しているので、ここでは2 つのことを気にしています: 数学を正しくすること、そしてインターフェースを十分に明白にして、描画が公平だったかどうか疑問に思わないようにすること、どちらも彼らが聞こえるよりも重要であることがわかります。
リストランダマイザーとは何ですか?
リストランダマイザーは、1 行に 1 つずつアイテムのリストを取得し、ランダムに再配置またはサンプリングします。フェアシャッフルとは、正しく見える間違った答えで解決された問題です。ランダムなキーによる並べ替えはバイアスされますが、フィッシャーイェーツシャッフルにはバイアスがかかりません。ブラウザはバイアスされていないビットを供給します crypto.getRandomValues()。 names, prizes, tasks, teams, or ideas に貼り付け、リスト全体をシャッフルした順序で戻すか、要求した当選者の数をピックアップするかのどちらかです。 " randomly" を選択しようとしたときに人間が持ち込む静かなバイアスを削除するという利点を持つ、ボウルから折り畳まれたスリップを描くソフトウェア バージョンです。
本当に2 つの操作しかなく どちらが欲しいかを知ることは スキル全体です シャッフルでは 与えたすべてのアイテムを 新しいランダムな順序で返すだけで 何も追加も失われません ピックはサブセットを返し プールから決められた数のアイテムを 描画します ラッフルとは ピックです スタンドアップで誰が最初に プレゼントするかを決めるのは シャッフルです ほとんどの人は 間違ったものに少なくとも1 回手を伸ばします 通常は " shuffle そして 上位の3 つを取ります " 3 のカウントを持つPickが 1 つのステップで同じことをすると。
フェアシャッフルは実際にどのように機能しますか?
統計学者の友人が得ていた部分は次のとおりです スプレッドシートのトリック、各行に乱数を割り当てて並べ替える、ランダムだと感じますが、均一ではありません 並べ替えアルゴリズムは比較を行い、2 つのランダムなキーがたまたま近い場合、関係と比較の解決方法における小さなバイアスが結果に漏れます。小さなリストではスキューは小さいですが、それは現実であり、公平性が重要なものであれば何でも、"close enough" は素晴らしい答えではありません。
正しい方法はフィッシャー イェーツ シャッフルです。ドナルド クヌースがインプレース バージョンを普及させた後、クヌース シャッフルと呼ばれることもあります。これは 1938 年にロナルド フィッシャーとフランク イェーツによって説明され、1964 年にリチャード ダーステンフェルドによって最新のコンピューター形式が与えられました。アイデアは単純です。リストを最後の項目から 2 番目まで歩いてください。各位置で、リストの先頭から現在の位置までランダムなインデックスを選択し、次に 2 つの項目を交換します。各スワップは縮小する明確に定義された範囲から描画するため、可能な順序はすべてまったく同じ確率で出力されます。線形時間で実行され、各項目に 1 回接触し、リスト自体を超える余分なメモリは必要ありません。
ザ・ リストランダマイザー このアルゴリズムを直接使用します。置換せずに選択すると、同じシャッフルが早期に停止されます。リストをシャッフルしてから、最初の N 個の項目を取得します。これにより、勝者が明確であり、考えられるすべての勝者グループの可能性が同等であることが保証されます。
ランダム性はどこから来るのでしょうか?
アルゴリズムは、それを供給する乱数と同じくらい公平です。ランダム性の原因が予測可能であるか偏っている場合でも、完全なシャッフルによって歪んだ結果が得られます。ここでブラウザは維持されます。
現代のブラウザは公開します crypto.getRandomValues、オペレーティングシステムのエントロピープールから引き出された暗号的に強いランダムな値で配列を埋めるW3C Web Cryptography APIの一部であり、これは、W3C Web Cryptography APIのPart of the W3C Web Cryptography APIよりもずっと強力なソースです Math.random、これは高速擬似ランダムジェネレータであり、予測可能性が重要なものには決して意図されていません。 randomizerは好みます crypto.getRandomValues そして、に戻るだけです Math.random 暗号通貨ソースが本当に利用できない場合、現在のブラウザではほとんど利用できません。
もう一つ、正しく理解する必要があった微妙さがあります。ランダムな 32 ビット数を 0 から N マイナス 1 までの不偏インデックスに変えるには、N で割った後の剰余を取るだけではだめです。なぜなら、N が範囲に均等に分割しない限り、低いインデックスはもう少し頻繁に現れるからです。修正は拒否サンプリングです。範囲に収まる N の最大の倍数を計算し、そのカットオフを超えるドローが着地した場合は、それを捨てて再度ドローします。余分なドローの数は無視できるほど多く、バイアスは完全に除去されます。このツールは、選択したすべてのインデックスに対してこれを行います。これは、それがなくなるまで誰も気づかないような詳細です。
ランダマイザーはどのように使用すればよいですか?
インターフェイスにはボタンが1 つと選択肢が2,3 あります. これが私がそれを実行する方法です.
入力ボックスに、1 行に 1 つの項目ずつリストを貼り付けます。カンマ区切りのセルをスプレッドシートからコピーした場合は、入力区切り文字をカンマに切り替えると、代わりにカンマで分割されます。トリムとドロップブランクの動作はデフォルトでオンになっているため、空行がずれたり、誤って先頭スペースがファントム エントリになることはありません。
モードを選択してください.シャッフルですべての順序を変更します.pickは勝者を描画します.pickを選択すると、描画する数と繰り返しが許可されるかどうかを設定する小さなパネルが表示されます.givewayのために繰り返しをオフにしておくので、各勝者が別の人になることができます.repeats onは、例えばサイコロのような描画をシミュレートしていて、同じ値が正当に再現できる場合など、実際に置換によるサンプリングが必要な場合にのみオンにします。
クリック ランダム化 毎回新鮮で独立した結果が得られるので、再描画したい場合はもう一度クリックするだけです 出力をワンクリックでコピーして、アナウンス、チケット、または結果が生きるために必要な場所に貼り付けます リストが提供できる以上のユニークな勝者を要求した場合、ツールは静かに短いリストまたは繰り返しのリストを返すのではなく、他のツールが犯すのを見たことがあります。
実際には、私が貼り付けるリストはマップ全体にあります。賞品の抽選のための顧客メールの列である日もあれば、次のプルリクエストをレビューする人のためのチームの名前である日もあり、一度は誰も昼食を決定できなかったため、徒歩圏内のすべてのレストランでした。ツールはアイテムが何であるかを気にせず、ただアイテムがきれいに分離されているだけです。そのため、入力オプションは 1 秒の注目に値します。ソースがスプレッドシートのセルである場合、カンマ区切り文字は手作業による編集からあなたを救い、空白の行を含む乱雑なコピーペーストである場合、ドロップブランクのデフォルトは抽選前に静かに入力をフォーマットするのに費やした 1 分は、迷走した空行がエントリとしてカウントされるかどうかについて議論するのに費やさない分です。
いつシャッフルすればいいのか、いつピックすればいいのか?
2 つのモードは異なるジョブをカバーしており、以下の表は、私が始めたときに持っていたいチートシートです。
| あなたがしたい... | 使い | 繰り返し | なんでや |
|---|---|---|---|
| 話すか順番を決めるか | シャッフル | n/a | 誰もが中に留まり、秩序は公平です |
| プレゼントワーの勝者を 1 つ引きます | 1 を選んで数えます | オフ | シングル ユニーク 結果 |
| 数人の入賞者を抽選します | ピック、N 数えます | オフ | 明確な勝者、ダブルディッピングなし |
| 2 つのチームに人を割り当てます | シャッフルしてから分割します | n/a | シャッフルされたリストを半分に分割します |
| Sim の代わりとなるサンプル | ピック、N 数えます | オン | 同じアイテムが設計上再発する場合があります |
| プレイリストまたは読書リストをランダム化します | シャッフル | n/a | 何も落とさずに再注文 |
経験則: アイテムの数が同じままである必要がある場合は、シャッフルします。入力したアイテムよりも少ないアイテムを取り出したい場合は、選択します。チームの割り当ては、人々が考えすぎるものです。完全なリストをシャッフルし、前半をチーム A、残りをチーム B とします。両チームのサイズはランダムかつバランスが取れています。
公開プレゼントを運営するのは十分に公平ですか?
はい、そしてその理由は明白に述べる価値があります。 "fair" はツールの全体の値です。フィッシャーイェーツシャッフル、暗号学的ランダムソース、および拒否サンプリングの組み合わせは、すべての参加者が同一のチャンスを持ち、すべての可能な勝者のセットが同じ確率であることを意味します。これは、スリップサイズ、折り畳み、ボウルの混合具合がすべてバイアスをもたらす物理的な抽選よりも強力な保証です。
抽選は完全にブラウザーで実行されるため、ストリームや会議中に画面上でライブで行うことができ、これは公開抽選に人々が求める透明性です。サーバーには何も送信されないため、クリックしてから発表までの間に結果が改ざんされる可能性のある隠しステップはありません。監査証跡が必要な場合は、抽選を画面記録します。参加者リストが表示され、クリックが表示され、勝者がすぐに表示されます。
私のリストは非公開ですか?
これは最初に現れるよりも重要です なぜなら人々がランダム化するリストは しばしば公開されないからです 候補の候補リスト 社内のチーム名 顧客エントリ メールリストはすべて機密です ランダム化装置は プレーンなJavaScriptで 全てをローカルに処理します リストがアップロードされたり ログに記録されたり 保存されたりすることはなく ランダム化をクリックしても リクエストが全く発生しないブラウザネットワークタブで 確認できます またページが読み込まれると オフラインで動作し続けます。
これは Toolz 全体の意図的なスタンスであり、その理由についてはメモに書きました オンライン ツールのデータ プライバシー. ランダム化装置は、それが重要な理由の良い例です。入力は実際の人々のリストであることが多く、実際の人々のリストはまさに、これまで一度も監査したことがないサーバーのリクエスト ログに載せたくない種類のものです。
描画をよりクリーンにするいくつかの習慣
描画する前にリストをクリーニングします。 「1 人が 2 回表示される可能性がある場合は重複を削除」をオンにすると、二重入力によってオッズが密かに 2 倍になることはありません。空白行のドロップはデフォルトでオンになっていますが、後続の空の行がカウントされていないことを確認するのは一目見る価値があります。
カウントを賞品に合わせる ピックモードでは、カウントを必要な当選者の正確な数に設定し、繰り返しをオフにします 賞品が3 つある場合は、1 回の抽選を3 回クリックするのではなく、一度に3 回描画することで、別々のクリックで同じ名前が2 回出てくるという厄介なケースを回避できます。
秘密ではなくオープンに再描画する 勝者が不適格な場合は、勝者を削除し、見ている人の前で再描画します。公平性は、最初のクリックで結果が最終的なものになることからではなく、プロセスが見えることから生まれます。
ブラウザに保持します。 i ship のすべてのツールと同様に、ローカル処理は、より高速でプライベートであるため、デフォルトです。小さなユーティリティの個人キットを組み立てている場合は、 乱数発生器 数値描画用のランダマイザーと自然にペアになり、幅広になります 開発者の生産性向上ツール roundup は、ブラウザー優先のツールボックスを構築する価値がある理由を説明します。
一見の価値がある関連ツール
ランダムな選択が繰り返し必要な場合、数人の隣人が近くに座っています。ザ 乱数発生器 同じ暗号グレードのランダム性を持つ範囲で数値を描画します。これは、選択しているものがリストからの項目ではなく値である場合に必要なものです。ザ UUID ジェネレータ レコードとテストデータの一意の識別子を生成します。 the パスワードジェネレータ 同じ強力なランダム ソースを安全なパスワードの作成に適用します。 3 つすべてが、ランダム化子とまったく同じように、サインアップなしでブラウザーで実行され、そのファミリーの識別子側をカバーします パスワードジェネレータガイド。
よくある質問
リストランダマイザーはどのように機能しますか?
ツールは、あなたのリストを 1 行につき 1 つ読み取ってから、すべてのアイテムを再注文するか、要求した勝者を引き出します。 シャッフルリングは、フィッシャー イェーツ アルゴリズムを使用します。これは、リストを 1 回歩き、ランダムに選択された以前の位置に各アイテムを入れ替えて、一様にランダムな順序を生成します。 ランダムな位置は、ブラウザの暗号化ジェネレーターから取得されるため、結果は真に偏りがありません。
ランダム化は本当に公平ですか?
はい。 crypto.getRandomValues、最新のブラウザに組み込まれている暗号のランダムソースから描画し、拒否サンプリングを使用しているため、インデックスが他のインデックスよりも少しでも可能性が高いものはありません。フィッシャーイェーツシャッフルと組み合わせると、リストの考えられるすべての順序に等しいチャンスがあり、手動シャッフルやランダムキーを使用したスプレッドシートソートよりも公平になります。
名前のリストからランダムな勝者を選ぶにはどうすればよいですか?
1 行につき 1 つ名前を貼り付け、ピック モードに切り替え、カウントを 1 に設定して、[ランダム化] をクリックします。 このツールは、1 つのランダムな名前を返します。 一度に複数の勝者を抽選するには、カウントを高く設定し、繰り返しを無効にして、各勝者が一意になるようにします。
シャッフルとピックの違いは何ですか?
シャッフルはリスト全体を新しいランダムな順序で返します。これにより、何も追加または削除されず、再配置されるだけです。 Pick は、リストから指定した勝者数を引いて、サブセットを返します。 ターン オーダーまたは座席にはシャッフルを使用し、プレゼント、サンプル、またはより大きなグループから数人の人を選ぶように選びます。
同じアイテムを複数回選択できますか?
リピートを有効にした場合のみ デフォルトでは、Pick モードは置換なしで描画するため、すべての勝者は異なるアイテムとなり、抽選会やプレゼント企画に必要なものとなります。 repeats をオンにすると、同じアイテムが再び現れる置換によるサンプリングが可能になり、シミュレーションに役立ちます。
私のリストよりもユニークなアイテムを選ぶことができないのはなぜですか?
繰り返しがなければ、各勝者は個別のアイテムである必要があるため、8 人のリストから 10 のユニークな勝者を引き出すことはできません。 それが起こると、ツールは間違った結果を返すのではなく、あなたに指示します。 リストのサイズに合わせてカウントを下げるか、繰り返しを有効にしてアイテムを再利用できるようにします。
私のリストはサーバーにアップロードされていますか?
いいえ すべての解析とランダム化は、プレーンなJavaScriptを使用してブラウザでローカルに実行され、何も送信、ログ、または保存されません。 「ランダム化」をクリックしてもリクエストが行われないブラウザネットワークタブで確認できます。ページがロードされると、オフラインでも機能します。
抽選やプレゼントに使えますか?
はい。 参加者を 1 行に 1 つ貼り付け、ピック モードをリピートを無効にして、カウントを賞品の数に設定します。 クリックするたびに、新しい独立したユニークな勝者のセットが描画されます。 ドローは偏りがなく、クライアント側で発生するため、画面上でライブで透過的に実行できます。



