乱数生成ツールの基本仕様と初期動作
ZeroToolsの乱数生成ツールは,「数値生成」「サイコロ」「コイントス」の3つのタブで構成されるフロントエンド専用のユーティリティです.ページにアクセスした直後の初期状態では「数値生成」タブが選択された画面が表示されます.このときの各入力項目の初期設定値は,最小値が「1」,最大値が「100」,生成個数が「5」,重複設定が「重複なし」,昇順並び替えが「オン」として定義されています.
また,ページを開いた初回には,ReactのuseEffect等のクライアント側処理によって自動的に1回目の数値生成関数が実行され,利用者がボタンを押さずとも初期設定に基づく5つの数値が画面の出力エリアに表示されます.
本ツールが扱うすべての状態(入力されたパラメータ,生成された数値の配列,サイコロの出目データ,コイントスの表裏の結果やそれぞれの累計回数など)は,Reactコンポーネントのメモリ領域に変数として保持されています.そのため,ブラウザの再読み込み(リロード)操作を実行すると,Reactのコンポーネントが再マウントされ,これらすべてのセッション内の状態変数は初期値へとリセットされます.
このツールの数値生成処理には,入力パラメータをサーバーに送るコードは含まれていません.ただし,ページには広告枠が配置されており,広告の読み込みやアクセス解析などの別通信は発生し得る環境です.
数値生成ロジックと設定の境界値
数値生成機能の根幹は,JavaScriptの標準関数であるMath.random()です.この関数は0以上1未満の浮動小数点数を返します.指定された範囲の整数を得るために,この乱数に範囲の幅(最大値 - 最小値 + 1)を掛け,小数点を切り捨てた後に最小値を加算する処理が行われます.
利用者は最小値,最大値,生成個数の入力フィールドに数値を指定します.これらの入力値は整数の境界を前提として処理されており,小数を含めた入力に対する厳密な動作保証は行われていません.入力値に対し,最小値が最大値以上(最小値 >= 最大値)となる設定が行われた場合は,生成ロジックが実行される前に処理が中断され,画面上に警告メッセージが表示されます.
重複設定の有無によって,乱数抽出のアルゴリズムは異なります.重複ありに設定された場合は,指定された生成個数に到達するまでの間,ループ処理によって毎回設定範囲全体から独立してMath.random()による数値の抽出を繰り返します.一方,重複なしに設定された場合は,最初に最小値から最大値までのすべての連続する整数を含む候補配列をメモリ上に生成します.
その後,その候補配列に対して部分的なFisher-Yatesシャッフルアルゴリズムを適用します.具体的には,生成個数分の回数だけ,配列の未選択部分からランダムなインデックスを選び,選択済み領域の要素と交換することで,ユニークな数値を取り出します.この仕組み上,重複なし設定において生成個数が範囲の幅よりも大きく設定された場合は,候補配列の要素数が不足して一意な数値で満たすことができないため,同様に警告が表示されて処理が停止します.
出力される数値の並び順は昇順スイッチの状態によって決定されます.オフの場合は選出された順序のまま結果配列が画面に描画されます.オンの場合は,抽出が完了した結果配列に対して,数値を小さい順に並び替えるソート処理が適用されてから表示されます.確定例として,最小値1,最大値6,生成個数6,重複なし,昇順オンの状態で実行した場合,内部でのFisher-Yatesシャッフルによる選出順序は毎回異なり得ますが,最後に必ずソートが行われるため,最終的な画面表示は必ず1, 2, 3, 4, 5, 6の順序になります.
生成された数値結果は,UI上のボタンからカンマと半角空白で区切られた形式でクリップボードへコピーできます.このテキスト形式はそのままではJSON配列ではないため,JSONフォーマッターに貼り付けると構文エラーになります.整数の結果なら,手動で前後に角括弧を足して有効なJSON配列にできます.
サイコロ機能のアニメーションと算出プロセス
サイコロタブは,1から6までの目を持つ一般的な六面サイコロをシミュレートする機能です.利用者はUI上の1個〜5個の選択ボタンから,一度に振るサイコロの個数を設定できます.サイコロを振るアクションを実行した直後に,最終的な出目が即座に確定して計算されるわけではありません.
実行ボタンを押下すると,まず約80ミリ秒の間隔で画面上のサイコロの出目が次々とランダムな面に切り替わる,インターバルタイマーを用いたアニメーション処理が開始されます.この間,サイコロの面を表す点の配置が視覚的に連続して変化します.
この演出が約800ミリ秒継続した後,インターバル処理が停止し,各サイコロごとに改めてMath.random()が評価され,最終的な出目が決定されます.決定された出目はReactの状態変数に保存され,画面に最終結果として表示されます.複数のサイコロ(例:2個)を振る設定にした場合は,それぞれのサイコロが独立したMath.random()の評価によって1から6の目を出します.
アニメーション終了後の画面には,個々のサイコロの確定した出目(点の配置)が並んで表示されるとともに,それらの数値を合算した合計値が表示されます.2個の場合の合計値は2〜12,最大の5個の場合は5〜30の範囲です.具体的な出目は抽選前に確定できません.
サイコロタブを開いた直後は,内部状態として出目が[3, 4]の2個(合計7)と初期表示されますが,これは利用者が振って得た確定結果ではありません.1個〜5個の選択ボタンで個数を切り替えると表示用の出目が即座に再選出されますが,実際の「サイコロを振る」操作による最終的な出目は,ボタン押下から約800ミリ秒後に改めて選び直されて確定します.
コイントスの判定タイミングと累計カウンター
コイントスタブは,硬貨を用いて表(Heads)と裏(Tails)の2つの結果から一方を判定する機能です.実行ボタンを押下すると,結果がただちに判定されるのではなく,画面上で硬貨が回転するかのような視覚的な演出が約600ミリ秒にわたって再生されます.この演出時間が完全に経過した直後に,内部のタイムアウト処理の中でMath.random() < 0.5という条件式が評価されます.
この評価により,生成された乱数が0.5未満であれば表,0.5以上であれば裏として状態が確定し,最終的な硬貨の面が画面に表示されます.
コイントスタブの初期状態では画面に「表」が表示されていますが,累計カウンターは表0・裏0です.この表示は初期設定の見た目に過ぎず,過去のトス結果を示すものではありません.実際に「コインを投げる」アクションを実行し,約600ミリ秒後に表か裏のいずれかが確定して初めて,該当する側のカウンター数値が1加算され,結果として記録されます.
このタブの画面内には,現在の利用状況を記録するカウンター領域が設けられています.約600ミリ秒後の判定によって結果が確定するたびに,Reactのステート更新処理が走り,累計の表の回数または累計の裏の回数の該当する側の数値が正確に1加算されます.この累計回数および両者を足した合計回数は,ページを開いてから現在までにページ内で確定したコイントス操作の実際の試行回数を表しています.
第1章で触れた通り,ブラウザの再読み込み操作を行うと,これらのカウンター変数も初期値の0にリセットされます.
本ツール全体を通して使用されているMath.random()は暗号用途や公式な抽選に向けた動作保証のある関数ではないため,出力結果は日常の簡易な用途を想定したものです.設定した範囲や条件に従ってブラウザ内で完結して実行されるため,統計的な無作為性の完全な保証や,厳密な要件を満たすものではない点に留意して利用する必要があります.