初めて乱数が私を噛んだのは、私が Toolz.dev の構築を開始する何年も前の Laravel サイド プロジェクトでした。短い紹介コードが必要でした rand() すぐそこにあったからです そして出荷しました 1週間後 2人のユーザーが同じコードを持っていました オッズが天文学的なものだったからではなく 何を誤解していたからです rand() 実際に約束した。 その小さな恥ずかしさは、私がToolz.dev上のすべてのツールに持ち込んだ教訓を教えてくれました: " random" 1 つのことではありません。サイコロの出目には問題ないカジュアルなランダムがあり、値が何かを守る瞬間に必要な深刻なランダムがあります。
このガイドは、当時誰かが教えてくれたらよかったのにと思うことの長いバージョンです。 で乱数を生成する方法を説明します Random Number Generator Toolz.dev では、一意のみのセットが重要な場合、ランダム性のソースが出力を安全に使用できるものを変更する理由と、構築中に出力を取得する実際のケースが重要です。
tl;dr: 乱数ジェネレーターは、定義した範囲から値を描画します。 minimum と maximum を設定し、必要な数の数値を選択し、整数または小数を選択します。 unique-only をオンにします。 no value may repeat の場合、これは宝くじ、抽選会、および交換なしのサンプリングに必要です。 Toolz.dev ジェネレーターは完全にブラウザーで実行され、そのランダム性のために Web Crypto API を優先するため、生成したものはデバイスから消えることはありません。
乱数発生器は実際に何をしますか?
乱数発生器は予測不可能なビットのソースを範囲にマッピングします それが全体のジョブです ブラウザで重要なのはソースです crypto.getRandomValues()、ウェブ暗号APIが暗号的に強くなければならないもの - とは異なり Math.random()、これはそのような約束をしない.あなたはそれに間隔を告げる,例えば1 から100,そしてそれは理想的には,すべての値が等しいチャンスが現れるその間隔の内側から値を返す.1 つ以上を求め,それは引き分けを繰り返す.
興味深いのは " unpredictable, " という単語です なぜならコンピュータは自然に驚きを生み出さない 決定論的な機械だからです 生成するのは擬似ランダム性です ランダムに見え 統計的テストに合格するが 開始シードからアルゴリズムで生成される数列です 同じアルゴリズムに同じシードを与え 毎回同じ数列が得られます その再現性は 再現性が必要なテストを書いているときの特長です 推測できないはずのものを鋳造しているときの 責任です。
Toolz.dev では、ジェネレーターはブラウザーに座り、そのビットを読み出します crypto.getRandomValues ブラウザが公開すると、現代のブラウザなら誰でもそうなります。その機能は W3C Web 暗号 API によって定義され、オペレーティング システム' の暗号的に安全なソースによってサポートされています。そのソースが存在すると、数値はトークンのピッキングやデッキのシャッフルなどのセキュリティに隣接する作業に十分な予測不能になります。何らかの理由で利用できない場合、ツールは標準の JavaScript ジェネレーターに戻ります。これはゲームやサンプリングには問題ありませんが、秘密を播種してはなりません。これら 2 つの世界のどちらにいるかを知ることは、RNG ウェルを使用する上で最も重要なことです。
どうやって Toolz.dev で乱数を生成するのですか?
ほとんどの場合、数値が必要なだけで、今すぐ必要なため、フローは意図的に短くなります。
まず範囲を設定します 最小値と最大値を入力します 整数の場合 範囲は両端で包含されます だから1 から6 は 1, 2, 3, 4, 5, 6 のいずれかを返すことができ ダイとまったく同じように 負の値や -50 から50 など ゼロにまたがる範囲も同様に機能します。
次に、必要な数の数値を選択します。 1 つの数値を素早く選択するか、テスト データをシードしたりサンプルを構築したりするときに最大 10,000 個のバッチを選択します。
第三に、オプションを選択します。整数については "integers only" をオンにするか、小数点が必要な場合はオフにして小数点以下の桁数を設定します。 " ユニークな値 only" をオンにします。数字が繰り返されない場合。
最後に「生成」をクリックします。 「結果」には、合計と平均とともにリストが表示され、バッチ全体が改行区切りのリストとしてコピーされるため、スプレッドシートの列、スクリプト、またはテスト フィクスチャにそのままドロップされます。 を使用した場合 uuid ジェネレーター それか、 パスワード ジェネレーター Toolz.dev では、ジェネレーターの一貫性を保つようにしているため、この形状がよく知られているように感じられます。
一意のみの数字はいつ使うべきですか?
これは人々が見逃しているオプションであり、数学を最も変えるオプションです。
デフォルトではジェネレーターは置換で描画します すべての描画は独立しているので、同じバッチに2 回以上数字が表示されることがあります ローリングサイコロの場合は正しいです、なぜなら本物のサイコロのペアが絶対に2 つの4 を考え出すことができるからです しかし、宝くじの描画、抽選会、またはトークンをバッグに戻さずにサンプルを選択しているときは、それは間違っています。
ユニークオンリーをオンにし、ジェネレーターは交換せずに描画します。すでに作成したものを記録し続け、バッチを埋めるまで繰り返しをスキップします。古典的な用途は宝くじ番号です。重複のない 1 から 49 までの 6 つの番号が必要な場合、ユニークオンリーは有効なチケットと壊れたチケットの差です。
ここには自然な限界があり ツールはそれを尊重します 範囲が保持できる以上の 一意の整数を描くことはできません 1 から5 までの10 個の一意の数字を尋ねて 有効な答えはありません なぜなら その間隔に5 個だけの 明確な整数が存在するためです 6 個目の不可能な値を見つけようと永遠に回転するのではなく ジェネレーターが停止し 範囲が小さすぎると言うのです 生成コードは本番コードに ぶら下がりすぎる 素朴なシャッフルループを見て わざとガードを組み込んだのです。
整数または小数: どちらが必要ですか?
整数はほとんどの要求をカバーします。, サイコロ, 宝くじのボール, 配列インデックス, レコード カウントはすべて整数です。, 整数モードは、人々がそれらについてどのように考えるかに一致する包括的な範囲を与える。
小数は連続量に対するものです: ランダムな価格、シミュレートされたセンサーの読み取り値、重み、確率です。整数モードをオフにして、ツールは最小値を含むが最大値を含まない半開区間から描画します。最小値を含む場合と最大値を除外する場合の半開規則は、JavaScript's 自身のものを含む、あらゆる言語のほぼすべての浮動小数点 RNG の基礎となるものと同じです Math.random、これは 0 から 1 までの範囲の値を返しますが、1 は含みません。その規則と一致するということは、ここで取得した数値がコードで取得した数値のように動作することを意味します。
また、小数点以下の桁数を 1 から 10 まで制御します。 通貨のような値には 2 桁が適しており、より細かい解像度が必要な測定値をシミュレートする場合はさらに多くなります。一意のみプラス小数は、個別の小数の空間が膨大であるのに対し、一意のみプラス小さな整数の範囲は上記の壁にぶつかる場所であるため、ほとんどの場合満たされることに注意してください。
"random enough" はどのくらいランダムですか?
これは、その紹介コード事件以前に見たかった表です。一般的なユースケースを、実際に必要なランダム性の種類にマッピングします。
| ユースケース | ランダム性が必要です | 繰り返しは許可されますか? | 注意事項 |
|---|---|---|---|
| サイコロ、ボードゲーム | 擬似ランダムでいい | はいって | ロールごとの独立性がポイントです |
| ランダムな勝者を選ぶ | 暗号化が望ましい | いいえ (一意のみ) | 公平性は重要であり、一意のみを使用してください |
| 宝くじまたは抽選番号 | 暗号化が望ましい | いいえ (一意のみ) | 交換なしで描画します |
| 分析用のサンプリング行 | 擬似ランダムでいい | 通常はいいえ | 交換なしのサンプリング専用です |
| 種付け試験器具 | 擬似ランダムでいい | はいって | 再現性が望ましい場合もあります |
| セキュリティトークン、秘密 | 暗号が必要です | いやー | ここではプレーンな PRNG は絶対に使用しないでください |
人々をつまずかせる行は "security tokens." 汎用的なRNGは、たとえ優れたものであっても、専用のシークレットジェネレーターの代わりにはなりません APIキー、セッショントークン、パスワードを作成する場合は、 のように、そのジョブ用に設計されたツールを使用します パスワード ジェネレーター、またはのようなハッシュツール ハッシュジェネレーター 固定長のダイジェストが必要な場合 乱数発生器は暗号鍵材料ではなく、範囲内の数値用であり、その境界の正直なフレーミングは、1 つのツールがすべてを行うふりをするよりも便利です。
実際にそれで何を構築できますか?
これが私のワークフローの中で重要な位置を占める方法のいくつか。
リストをレンダリングする UI をテストしているとき、数量、価格、またはスコアを表す数百の数字のバッチを生成し、それらをフィクスチャに貼り付けます。突然、レイアウトは同じ 3 つの手で入力された行ではなく、現実的な多様性で実行されます。 WP Adminify での WordPress 作業では、ランダムな値を使用してデモ コンテンツにデモンストレーションし、設定画面がスクリーンショット内で生き生きと見えるようにしました。
クライアントがプレゼント企画を実行すると、ユニーク専用モードは、番号付きの応募者リストから公平に当選者を選びます。各応募者に番号を割り当て、賞品の数だけユニークな当選者を抽選します。スプレッドシートの計算式はなく、抽選が不正に行われたかどうかについての議論もありません。なぜなら、数字はどちらも制御できないソースからのものだからです。
統計的直観を素早く行うには、大きなバッチを生成し、合計と平均を一目見ることは、範囲と分布が動作しているかどうかの迅速な健全性チェックです。 1から100までの数値を求め、平均が50近く戻ってきた場合、世界は予想通りです。
そして、日常的なものとしては、サイコロのローラー、1 と 2 を表と裏として扱うときのコイン投げ、そして " 数値を選択して引用; 小さな引数のセトラーです。役に立つためには、すべての使用が真剣である必要はありません。
これはあなた自身のものを書くこととどのように比較されますか?
書いてもいいでしょう Math.floor(Math.random() * (max - min + 1)) + min そして完了です.私はその行を千回書きました.ではなぜ道具に手を伸ばすのか?
2 つの理由、どちらもハードな方法で学んだ 1 つ目は、特に包含対排他境界と一意のみの要件を追加すると、手転がし範囲数学に忍び込むオフバイワンとモジュロバイアスの間違いです。 " を含むエッジケースをツールが処理します。 exist" ケースよりも多くのユニークな値を要求したため、午前 2 時に再検出することはありません。 2 つ目は Math.random は明示的に暗号的に安全ではない、とMDNのドキュメントにはっきりと述べられている事実であり、後で本物の何かをガードするコードにスニペットを貼り付けると、忘れがちである。 Toolz.devジェネレータはデフォルトで暗号ソースになるため、より安全な動作は、何も考えずに取得されるものである。
制御する環境内の 1 回限りの番号の場合は、スニペットで十分です。反復可能な描画、一意のセット、コピーするバッチ、またはデフォルトで暗号ソースを必要とするすべての場合、ツールは操作可能な部分を保存します。
作業が数値生成よりもエンコードとフォーマットに傾いている場合は、同じクライアント側の哲学がツールボックスの残りの部分に通じています ロレム・イプサム プレースホルダー テキストを、でカバーされている広いセットに変換するジェネレーター 開発者の生産性向上ツール ガイド。そして、これらはすべてローカルで実行されるため、 データプライバシー ストーリーはそれらすべてで同じです。入力はブラウザ内に残ります。
人々が乱数で犯すよくある間違いは何ですか?
何年もコード、私、その他の人々' をレビューした後、同じ一握りの間違いが何度も現れ、それらを避けることができるように名前を付ける価値があります。
1 つ目は混乱させる " unlikely" with "impossible." My referral-code story is exactly this.範囲からの置換で描画すると、衝突はバグではなく、十分な描画が与えられた統計的確実性です。 誕生日のパラドックスは古典的なイラストです: わずか 23 人のグループでは、2 人が誕生日を共有する可能性は 50 パーセントを超え、直感が示唆するよりもはるかに高くなります。なぜなら、すべてのペアを比較しているからであり、すべての人を 1 つの固定日付と比較しているわけではないからです。値がユニークでなければならない場合は、範囲が十分に大きいことを望まないでください。 unique-only をオンにして、疑問を取り除きます。
2 つ目は間違ったソースに手を伸ばすことです。多くのチュートリアルでは、その上に構築された範囲公式が示されています Math.random そしてセキュリティに敏感なものに不適当であるとは決して言わない 値はランダムに見え、デモは機能し、習慣は固執する その後、誰かがパスワードリセットトークンを生成するコードにスニペットコピーし、そして今、 " random" トークンは、基礎となるアルゴリズムを理解する誰にでも予測可能なルールである: 人間が決して値を推測できないはずなら、それは暗号ソースを必要とする Toolz.devジェネレーターは、そのソースにデフォルト設定され、それは周りに習慣を構築するためのより安全なデフォルトである。
3 つ目は範囲境界でのオフバイワンエラーです 排他的エンドポイントと排他的エンドポイントは 経験豊富な開発者でもつまずきます 言語や関数が異なれば 選択肢も異なるからです 100 は 1 から 100 を求めると出力が考えられますか? ここにある整数の場合 はい 両端は含まれます 小数の場合 最大値は除外され 浮動小数点規則に一致します どの規則が適用されるか明示的であるため サイコロが6 を出さないという 静かなバグが防げます あなたが書いたからです < max 代わりに <= max。
4つ目は小さなサンプルがランダムに見えると仮定することです真のランダム性は塊や筋を生み出します公正なコインを10回裏返し4つの表の実行は完全に正常ですが人々はそれを見てコインかジェネレーターが壊れていると仮定しますランダム性は偶数間隔と同じではありません等間隔の値が必要な場合は乱数ジェネレーターはまったく不要ですシーケンスが必要です実際にどれが必要かを知ることは戦いの半分です。
よくある質問
乱数発生器はどのように機能しますか?
乱数ジェネレーターは、予測不可能なビット ソースを選択した範囲にマッピングします。このツールは、Web Crypto API が利用可能になったときに Web Crypto API からバイトを読み取り、最小から最大までの間隔にスケーリングするため、範囲内の各値が描画される可能性は等しくなります。
数字は本当にランダムですか?
それらは暗号学的に強い擬似乱数であり、すべての実用的な目的には予測できません。 crypto.getRandomValuesブラウザが公開されると、出力はトークンとシャッフルに適しています; 標準ジェネレーターのみが利用可能な場合、値はまだよく分散されていますが、秘密には使用しないでください。
繰り返しのない一意の乱数を生成するにはどうすればよいですか?
生成する前に一意のみのオプションを有効にします。 tool は置換なしで描画するため、バッチ内のすべての数値が異なります。範囲が保持できるよりも多くの一意の整数を要求すると、永久にループするのではなく、それが表示されます。
小数を生み出すことができるでしょうか?
はい。 integer オプションをオフにして、必要な小数点以下の桁数を設定します。 decimals は、連続範囲の標準規則である、最小値を含むが最大値を含まない半開区間から描画されます。
負の数字を使ってもいい?
はい。 -50 から 50 など、負の最小値、負の最大値、またはゼロにまたがる範囲を入力します。ジェネレーターは、正の範囲を処理するのと同じように、負の範囲と混合範囲を処理します。
一度に何個の数字を生成できますか?
バッチごとに最大 10,000 個の数値。結果には合計と平均が含まれているため、大きなバッチを一目で正気チェックでき、リスト全体が改行区切りの値としてコピーされます。
この乱数発生器は自由でプライベートですか?
はい。サインアップや使用上限がなく無料であり、すべての数値がブラウザで生成されます。範囲、カウント、結果がサーバーに送信されることはありません。
乱数ジェネレーターは何に使用できますか?
一般的な用途には、宝くじや抽選番号の選択、ゲームのサイコロの振り、ランダムな勝者の選択、テスト データのシード、分析のための行のサンプリング、リストの順序のランダム化などが含まれます。ユニークなみのモードでは、繰り返しなしでサンプリングが必要なあらゆるケースをカバーします。



