決定論的なコンピュータプログラムでは、真の乱数を生成することはできない。ほとんどの用途では、擬似乱数で十分である。擬似乱数の系列は、決定論的な手法で生成される。これらの数値は真にランダムではないが、乱数系列を模した特定の性質を備えている。例えば、擬似乱数系列では、考えられるすべての値が等しい頻度で現れる。
擬似乱数は、シード値から生成されます。任意のシード値から開始しても、random 関数は常に同一の数列を生成します。デフォルトでは、Emacs
は起動時に乱数シードを初期化するため、random の値の数列は(極めて高い確率で)Emacs
の実行ごとに異なります。乱数シードは通常、システムエントロピーから初期化されますが、エントロピープールを持たない旧式のプラットフォームでは、現在時刻などのランダム性の低い揮発性データからシードが取得されます。
乱数列を再現可能にしたい場合があります。例えば、乱数列によって動作が変わるプログラムをデバッグする際、実行するたびに同じ動作が得られると便利です。乱数列を再現するには、(random "") を実行してください。これにより、お使いの Emacs
実行ファイル固有の定数にシード値が設定されます(ただし、他の Emacs
ビルドでは異なる場合があります)。他の文字列を指定することで、さまざまなシード値を選択することも可能です。
この関数は擬似乱数の整数を返します。繰り返し呼び出すと、一連の擬似乱数の整数が返されます。
オプション引数 limit が正の整数である場合、値は非負かつ limit 未満となるように選択されます。limit
が負の値である場合はエラーとなります。それ以外の場合、値は任意の fixnum、すなわち most-negative-fixnum から most-positive-fixnum までの任意の整数となり得ます(整数の基本 を参照)。
limit
が文字列である場合、その文字列の内容に基づいて新しいシードを選択することを意味します。これにより、後続の random の呼び出しで再現可能な結果の系列が得られます。
limit が t である場合、Emacs
が再起動するかのように新しいシードを選択することを意味します。これにより、その後の random
の呼び出しで予測不能な結果が返されることになります。
limit のその他の値は、nil
として解釈されます。
暗号用途でランダムなノンスが必要な場合、いくつかの理由から、random
を使用するのは通常最善の方法とは言えません:
(random t)
を使用してシステムエントロピーを参照することもできますが、そうすることで、再現性のある結果から恩恵を受けるプログラムの他の部分に悪影響を及ぼす可能性があります。
random
で使用されているシステム依存の擬似乱数生成器(PRNG)は、必ずしも暗号用途に適しているとは限りません。
(random
t)への呼び出しではシステムエントロピーに直接アクセスすることはできず、エントロピーはシステム依存のPRNGを経由するため、結果にバイアスが生じる可能性があります。
(random t) の呼び出しは、ノンスに関する情報を Emacs
の内部状態のあちこちに散在させ、内部攻撃対象領域を拡大させる。
(random
t)は暗号学的に脆弱なソースからシードされる。