このパッケージは、Common Lisp乱数ジェネレータの実装も提供する。独自の 付加適合的アルゴリズムを使っており、多くの オペレーティングシステムによって提供される単純なジェネレータよりも、 ずっと統計的にきれいな乱数をおそらく与える。
この関数は、numberより小さく同じ型(整数か浮動小数点数のどちらか)
の、負でない乱数を戻す。state引数は乱数ジェネレータの状態を保持
するrandom-stateオブジェクトでなければならない。この関数は
副作用として、この状態オブジェクトを修正する。stateが省略された
場合、変数*random-state*を既定とする。*random-state*は、
あらかじめ初期化されたrandom-stateオブジェクトを含む。
この変数は、システム“既定”のrandom-stateオブジェクトを含み、
代替の状態オブジェクトを指定しないrandom*への呼び出しのために
使われる。Emacsプロセス内の任意の数のプログラムは、さしはさむような
仕方で*random-state*にアクセスしてもよいので、この変数から
生成される列は、意図や用途にかかわらず再現不能になるだろう。
この関数は、random-stateオブジェクトを作成またはコピーする。
stateが省略されるかnilの場合、新しい*random-state*
のコピーを戻す。これは、(random* n)と
(random* n s)(sは新しい
ランダムステートオブジェクト)の呼び出しの将来の列は同一の乱数列を
戻すという意味でコピーである。
stateがrandom-stateオブジェクトの場合、この関数はその
オブジェクトのコピーを戻す。stateがtの場合、この関数は
日時を種とする新しいrandom-stateオブジェクトを戻す。Common Lisp
への拡張として、stateは整数であってもよく、その場合は新しい
オブジェクトはその整数を種とする; それぞれ異なる整数の種は、完全に
異なる乱数列を生じるだろう。
random-stateオブジェクトをバッファまたはファイルに印字して、
後にreadで読み戻すことは正しい。プログラムが、デバッグ用に後に
再現させられるような疑似乱数の列を使いたい場合、新しい列を
取得するために(make-random-state t)を呼び出して、後にこの列を
ファイルへ印字することができる。プログラムが後で再実行される場合、
ファイルからオリジナルな実行のランダムステートを読むことができる。
この述語は、objectがrandom-stateオブジェクトの場合に
tを、さもなければnilを戻す。