このモジュールでは様々な分布をもつ擬似乱数生成器を実装しています。 整数用では、ある値域内の数の選択を一様にします。 シーケンス用には、シーケンスからのランダムな要素の一様な選択、 リストの要素の順列をランダムに置き換える関数、 順列を入れ替えずにランダムに取り出す関数があります。
実数用としては、一様分布、正規分布 (ガウス分布)、 対数正規分布、負の指数分布、ガンマおよびベータ分布を計算する 関数があります。 角度分布の生成用には、von Mises 分布が利用可能です。
ほとんど全てのモジュール関数は基礎となる関数 random() に依存 します。この関数は半開区間 [0.0, 1.0) の値域を持つ一様な浮動小数点数を生 成します。Python は中心となる乱数生成器として Mersenne Twister を使いま す。これは 53 ビットの浮動小数点を生成し、周期が 2**19937-1、本体は C で実装されていて、高速でスレッドセーフです。Mersenne Twister は、現存す る中で、最も大規模にテストされた乱数生成器のひとつです。しかし、完全に決 定論的であるため、この乱数生成器は全ての目的に合致しているわけではなく、 暗号化の目的には全く向いていません。
このモジュールで提供されている関数は、実際には random.Random クラスの隠蔽されたインスタンスのメソッドにバインドされています。 内部状態を共有しない生成器を取得するため、自分で Random のインスタンスを生成することができます。異なる Random のインスタンスを各スレッド毎に生成し、jumpahead() メソッドを使うことで各々のスレッドにおいて生成された乱数列が できるだけ重複しないようにすれば、マルチスレッドプログラムを作成する上で 特に便利になります。
自分で考案した基本乱数生成器を使いたいなら、クラス Random を サブクラス化することもできます: この場合、メソッド random()、 send()、getstate()、setstate()、および jumpahead() をオーバライドしてください。 オプションとして、新しいジェネレータは getrandombits() メソッドを提供できます -- これにより randrange() メソッドが 任意の、大きな範囲を超える集合を作成できるようになります。 バージョン 2.4 で 新たに追加 された仕様: getrandombits() メソッド
サブクラス化の例として、random モジュールは WichmannHill クラスを提供します。このクラスは Python だけで書かれた代替生成器を実装し ています。このクラスは、乱数生成器に Wichmann-Hill 法を使っていた古いバ ージョンの Python から得られた結果を再現するための、後方互換の手段になり ます。ただし、この Wichmann-Hill 生成器はもはや推奨することができない ということに注意してください。現在の水準では生成される周期が短すぎ、また 厳密な乱数性試験に合格しないことが知られています。こうした欠点を修正した 最近の改良についてはページの最後に挙げた参考文献を参照してください。 バージョン 2.3 で 変更 された仕様: MersenneTwister を Wichmann-Hill の代わりに使う
保守関数:
[x]) |
None
の場合、現在のシステム
時間が使われます; 現在のシステム時間はモジュールが最初にインポート
された時に乱数生成器を初期化するためにも使われます。
乱数の発生源をオペレーティングシステムが提供している場合、システム時刻の 代わりにその発生源が使われます(詳細については os.urandom() 関数を参照)。 バージョン 2.4 で 変更 された仕様: 通常、オペレーティングシステムのリソースは 使われません
x が None
でも、整数でも長整数でもない場合、
hash(x)
が代わりに使われます。
x が整数または長整数の場合、x が直接使われます。
) |
state) |
n) |
k) |
整数用の関数:
[start,] stop[, step]) |
range(start、stop、step)
の要素から
ランダムに選ばれた要素を返します。この関数は
choice(range(start, stop, step))
と等価ですが、実際には range オブジェクトを生成しません。
バージョン 1.5.2 で 新たに追加 された仕様です。
a, b) |
a <= N <= b
であるような
ランダムな整数 N を返します。
シーケンス用の関数:
seq) |
x[, random]) |
かなり小さい len(x)
であっても、x の順列は
ほとんどの乱数生成器の周期よりも大きくなるので注意してください;
このことは長いシーケンスに対してはほとんどの順列は生成されないことを
意味します。
population, k) |
母集団自体を変更せずに、母集団内の要素を含む新たなリストを返します。返さ
れたリストは選択された順に並んでいるので、このリストの部分スライスもラン
ダムなサンプルになります。これにより、くじの当選者を1等賞と2等賞(の部分
スライス)に分けるといったことも可能です。母集団の要素はハッシュ可能でな
くても、ユニークでなくても、かまいません。母集団が繰り返しを含む場合、返
されたリストの各要素はサンプルから選択可能な要素になります。整数の並びか
らサンプルを選ぶには、引数に xrange() オブジェクトを使いましょう。
特に、巨大な母集団からサンプルを取るとき、速度と空間効率が上がります。
sample(xrange(10000000), 60)
以下の関数は特殊な実数値分布を生成します。関数パラメタは 対応する分布の公式において、数学的な慣行に従って使われている 変数から取られた名前がつけられています; これらの公式のほとんどは 多くの統計学のテキストに載っています。
) |
a, b) |
a <= N <= b
であるような
ランダムな実数 N を返します。
alpha, beta) |
alpha > -1
および beta > -1
です。
0 から 1 の値を返します。
lambd) |
alpha, beta) |
alpha > 0
および beta > 0
です。
mu, sigma) |
mu, sigma) |
mu, sigma) |
mu, kappa) |
alpha) |
alpha, beta) |
代替の乱数生成器:
[seed]) |
[x]) |
[seed]) |
基本使用例:
>>> random.random() # Random float x, 0.0 <= x < 1.0 0.37444887175646646 >>> random.uniform(1, 10) # Random float x, 1.0 <= x < 10.0 1.1800146073117523 >>> random.randint(1, 10) # Integer from 1 to 10, endpoints included 7 >>> random.randrange(0, 101, 2) # Even integer from 0 to 100 26 >>> random.choice('abcdefghij') # Choose a random element 'c' >>> items = [1, 2, 3, 4, 5, 6, 7] >>> random.shuffle(items) >>> items [7, 3, 2, 5, 6, 4, 1] >>> random.sample([1, 2, 3, 4, 5], 3) # Choose 3 elements [4, 1, 5]
参考:
M. Matsumoto and T. Nishimura, ``Mersenne Twister: A 623-dimensionally equidistributed uniform pseudorandom number generator'', ACM Transactions on Modeling and Computer Simulation Vol. 8, No. 1, January pp.3-30 1998.
Wichmann, B. A. & Hill, I. D., ``Algorithm AS 183: An efficient and portable pseudo-random number generator'', Applied Statistics 31 (1982) 188-190.
ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。