決定論的なコンピュータープログラムでは真の乱数を生成することはできません。しかしほとんどの目的には、疑似乱数(pseudo-random numbers)で充分です。一連の疑似乱数は決定論的な手法により生成されます。真の乱数ではありませんが、それらにはランダム列を模する特別な性質があります。たとえば疑似ランダム系では、すべての可能な値は均等に発生します。
疑似乱数はシード値(seed
value)から生成されます。与えられた任意のシードから開始することにより、random
関数は常に同じ数列を生成します。デフォルトでは、Emacsは開始時に乱数シードを初期化することにより、それぞれのEmacsの実行において、random
の値シーケンスは(ほとんど確実に)異なります。乱数シードは通常はシステムエントロピーから初期化されます。ただしエントロピープールをもたない時代遅れのプラットフォームでは、カレント時刻のようなランダム度に劣る揮発性データからシードを取得します。
再現可能な乱数シーケンスが欲しい場合もあります。たとえば乱数シーケンスに依存するプログラムをデバッグする場合、プログラムの各実行において同じ挙動を得ることが助けになります。再現可能なシーケンスを作成するには、(random
"")
を実行します。これは特定のEmacsの実行可能ファイルにたいして、シードに定数値をセットします(しかしこの実行可能ファイルは、その他のEmacsビルドと異なるものになるであろう)。シード値として、他のさまざまな文字列を使用することができます。
この関数は疑似乱数の整数をリターンする。繰り返し呼び出すと一連の疑似乱数の整数をリターンする。
limitが正の整数なら、値は負ではないlimit未満の値から選択される。それ以外なら値はLispで表現可能な任意のfixnum(most-negative-fixnum
からmost-positive-fixnum
の間の任意の整数)となるだろう(整数の基礎を参照)。
limitが文字列なら、その文字列定数にもとづいた新しいシードを選択することを意味する。これにより後でrandom
を呼び出して再現可能な結果シーケンスをリターンさせることができる。
limitがt
なら、あたかもEmacsが再起動されたかのように新たなシードが選択されることを意味する。これにより後でrandom
を呼び出して予測不能な結果シーケンスをリターンさせることができる。
暗号化用に乱数ノンス(random nonce:
使い捨てのランダム値)が必要な場合にrandom
を使用するのは、いくつかの理由により適切ではありません:
(random
t)
を用いるのは可能とはいえ、あなたのプログラムのうち再現可能な結果から恩恵を受ける他の部分に悪影響を与えるかもしれない。
random
が使用するシステム依存の疑似乱数ジェネレーター(PRNG: pseudo-random number
generator)は、必ずしも暗号化に適している訳ではない。
(random
t)
は、システムエントロピーへの直接的アクセスを提供しない。このエントロピーはシステム依存のPRNGを通過するので、結果にバイアスがかかる可能性がある。
(random t)
の呼び出しによって、Emacsの内部状態が散在するノンス情報が残るので、内部的な攻撃面のサイズが増加する。
(random t)
が暗号化にたいして脆弱なソースからシードされる。