9.6. random —疑似乱数を生成します—Pythonドキュメント

提供:Dev Guides
< PythonPython/docs/2.7/library/random
移動先:案内検索

9.6。 ランダム —疑似乱数を生成します

ソースコード: :source: `Lib / random.py`



このモジュールは、さまざまな分布の疑似乱数ジェネレーターを実装します。

整数の場合、範囲から均一に選択します。 シーケンスの場合、ランダム要素の均一な選択、リストのランダム順列をインプレースで生成する関数、および置換なしのランダムサンプリングの関数。

実数直線には、一様分布、正規分布(ガウス分布)、対数正規分布、負の指数分布、ガンマ分布、およびベータ分布を計算する関数があります。 角度の分布を生成するために、フォンミーゼス分布が利用可能です。

ほとんどすべてのモジュール関数は、基本関数 random()に依存しています。この関数は、セミオープン範囲[0.0、1.0)で均一にランダムフロートを生成します。 Pythonは、コアジェネレーターとしてメルセンヌツイスターを使用します。 53ビットの高精度フロートを生成し、周期は2 ** 19937-1です。 Cの基本的な実装は、高速でスレッドセーフです。 メルセンヌツイスターは、現存する中で最も広範囲にテストされた乱数ジェネレーターの1つです。 ただし、完全に決定論的であるため、すべての目的に適しているわけではなく、暗号化の目的にはまったく適していません。

このモジュールによって提供される関数は、実際にはrandom.Randomクラスの非表示インスタンスのバインドされたメソッドです。 Randomの独自のインスタンスをインスタンス化して、状態を共有しないジェネレーターを取得できます。 これは、マルチスレッドプログラムで特に役立ちます。スレッドごとにRandomの異なるインスタンスを作成し、 jumpahead()メソッドを使用して、生成されたシーケンスが各スレッドに表示される可能性を高めます。重ならないでください。

クラスRandomは、独自に考案した別の基本ジェネレーターを使用する場合にもサブクラス化できます。その場合、random()seed()、 [X161Xをオーバーライドします。 ]、setstate()およびjumpahead()メソッド。 オプションで、新しいジェネレーターはgetrandbits()メソッドを提供できます。これにより、 randrange()は任意の広い範囲で選択を生成できます。

バージョン2.4の新機能: getrandbits()メソッド。


サブクラス化の例として、 random モジュールは、純粋なPythonで代替ジェネレーターを実装する WichmannHill クラスを提供します。 このクラスは、コアジェネレーターとしてWichmann-Hillアルゴリズムを使用した以前のバージョンのPythonからの結果を再現するための下位互換性のある方法を提供します。 このWichmann-Hillジェネレーターは推奨できなくなったことに注意してください。その期間は現代の標準では短すぎ、生成されたシーケンスはいくつかの厳密なランダム性テストに失敗することが知られています。 これらの欠陥を修復する最近の亜種については、以下のリファレンスを参照してください。

バージョン2.3で変更: MersenneTwisterがデフォルトのジェネレーターとしてWichmann-Hillに取って代わりました。


random モジュールは、システム関数 os.urandom()を使用してオペレーティングシステムによって提供されるソースから乱数を生成する SystemRandom クラスも提供します。

警告

このモジュールの疑似ランダムジェネレータは、セキュリティの目的で使用しないでください。 暗号的に安全な疑似乱数ジェネレーターが必要な場合は、 os.urandom()または SystemRandom を使用してください。


簿記機能:

random.seed(a=None)

乱数ジェネレーターの内部状態を初期化します。

Noneまたは、現在の時刻から、または利用可能な場合はオペレーティングシステム固有のランダム性ソースからの引数シードなし(可用性の詳細については、 os.urandom()関数を参照してください)。

aNoneintlong でない場合は、代わりにhash(a)が使用されます。 PYTHONHASHSEED が有効になっている場合、一部のタイプのハッシュ値は非決定的であることに注意してください。

バージョン2.4で変更:以前は、オペレーティングシステムのリソースは使用されていませんでした。

random.getstate()

ジェネレータの現在の内部状態をキャプチャするオブジェクトを返します。 このオブジェクトを setstate()に渡して、状態を復元できます。

バージョン2.1の新機能。

バージョン2.6で変更: Python2.6で生成された状態値を以前のバージョンにロードできません。

random.setstate(state)

state は、 getstate()の前回の呼び出しから取得されている必要があり、 setstate()は、ジェネレーターの内部状態をその時点の状態に復元します。 getstate()が呼び出されました。

バージョン2.1の新機能。

random.jumpahead(n)

内部状態を、現在の状態とは異なる、おそらく現在の状態から遠く離れた状態に変更します。 n は、現在の状態ベクトルをスクランブルするために使用される非負の整数です。 これは、Randomクラスの複数のインスタンスと組み合わせて、マルチスレッドプログラムで最も役立ちます。 setstate()または seed()を使用して、すべてを強制できます。インスタンスを同じ内部状態にし、 jumpahead()を使用して、インスタンスの状態を強制的に離すことができます。

バージョン2.1の新機能。

バージョン2.3で変更:特定の状態にジャンプする代わりに、 n が先に進み、jumpahead(n)は多くのステップで分離される可能性のある別の状態にジャンプします。

random.getrandbits(k)

k ランダムビットを含むpython long intを返します。 このメソッドはMersenneTwisterジェネレーターで提供され、他のいくつかのジェネレーターもAPIのオプション部分として提供する場合があります。 使用可能な場合、 getrandbits()を使用すると、 randrange()で任意の広い範囲を処理できます。

バージョン2.4の新機能。

整数の関数:

random.randrange(stop)
random.randrange(start, stop[, step])

range(start, stop, step)からランダムに選択された要素を返します。 これはchoice(range(start, stop, step))と同等ですが、実際には範囲オブジェクトを作成しません。

バージョン1.5.2の新機能。

random.randint(a, b)
a <= N <= bのようなランダムな整数 N を返します。

シーケンスの関数:

random.choice(seq)
空でないシーケンス seq からランダムな要素を返します。 seq が空の場合、IndexErrorを発生させます。
random.shuffle(x[, random])

シーケンス x を所定の位置でシャッフルします。 オプションの引数 random は、[0.0、1.0)でランダムな浮動小数点数を返す0引数の関数です。 デフォルトでは、これは関数 random()です。

len(x)がかなり小さい場合でも、 x の順列の総数はほとんどの乱数ジェネレーターの周期よりも大きいことに注意してください。 これは、長いシーケンスのほとんどの順列を生成できないことを意味します。

random.sample(population, k)

母集団シーケンスから選択された一意の要素の k 長さのリストを返します。 置換なしのランダムサンプリングに使用されます。

バージョン2.3の新機能。

元の母集団を変更せずに、母集団の要素を含む新しいリストを返します。 結果のリストは選択順になっているため、すべてのサブスライスも有効なランダムサンプルになります。 これにより、ラッフルの当選者(サンプル)を大賞と2位の当選者(サブスライス)に分割できます。

母集団のメンバーは、ハッシュ可能または一意である必要はありません。 母集団に繰り返しが含まれている場合、各出現はサンプルで可能な選択です。

整数の範囲からサンプルを選択するには、 xrange()オブジェクトを引数として使用します。 これは、sample(xrange(10000000), 60)の大規模な母集団からサンプリングする場合に特に高速で、スペース効率が高くなります。

次の関数は、特定の実数値分布を生成します。 関数パラメーターは、一般的な数学的手法で使用されているように、分布の方程式の対応する変数にちなんで名付けられています。 これらの方程式のほとんどは、統計テキストに記載されています。

random.random()
[0.0、1.0)の範囲内の次のランダムな浮動小数点数を返します。
random.uniform(a, b)

a <= bの場合はa <= N <= bb < aの場合はb <= N <= aとなるように、ランダムな浮動小数点数 N を返します。

終点値bは、式a + (b-a) * random()の浮動小数点の丸めに応じて、範囲に含まれる場合と含まれない場合があります。

random.triangular(low, high, mode)

low <= N <= highであり、これらの境界の間に指定された mode があるように、ランダムな浮動小数点数 N を返します。 low および high の境界は、デフォルトで0と1になります。 mode 引数は、デフォルトで境界間の中間点になり、対称的な分布になります。

バージョン2.6の新機能。

random.betavariate(alpha, beta)
ベータ分布。 パラメータの条件は、alpha > 0およびbeta > 0です。 戻り値の範囲は0から1です。
random.expovariate(lambd)
指数分布。 lambd は、1.0を目的の平均で割ったものです。 ゼロ以外である必要があります。 (パラメーターは「ラムダ」と呼ばれますが、Pythonでは予約語です。)戻り値の範囲は、 lambd が正の場合は0から正の無限大、 lambdの場合は負の無限大から0です。 は負です。
random.gammavariate(alpha, beta)

ガンマ分布。 ( Not ガンマ関数!)パラメータの条件はalpha > 0beta > 0です。

確率分布関数は次のとおりです。

          x ** (alpha - 1) * math.exp(-x / beta)
pdf(x) =  --------------------------------------
            math.gamma(alpha) * beta ** alpha
random.gauss(mu, sigma)
ガウス分布。 mu は平均であり、 sigma は標準偏差です。 これは、以下で定義する normalvariate()関数よりもわずかに高速です。
random.lognormvariate(mu, sigma)
正規分布をログに記録します。 この分布の自然対数を取ると、平均 mu と標準偏差シグマの正規分布が得られます。 mu には任意の値を指定でき、 sigma はゼロより大きくする必要があります。
random.normalvariate(mu, sigma)
正規分布。 mu は平均であり、 sigma は標準偏差です。
random.vonmisesvariate(mu, kappa)
mu は、0〜2 * pi のラジアンで表される平均角度であり、 kappa は集中度パラメーターであり、ゼロ以上である必要があります。 。 kappa がゼロに等しい場合、この分布は0〜2 * pi の範囲で均一なランダム角度に減少します。
random.paretovariate(alpha)
パレート分布。 alpha は形状パラメータです。
random.weibullvariate(alpha, beta)
ワイブル分布。 alpha はスケールパラメータであり、 beta は形状パラメータです。

代替発電機:

class random.WichmannHill([seed])
Wichmann-Hillアルゴリズムをコアジェネレーターとして実装するクラス。 Randomと同じメソッドに加えて、以下で説明する whseed()メソッドがすべてあります。 このクラスは純粋なPythonで実装されているため、スレッドセーフではなく、呼び出しの間にロックが必要になる場合があります。 ジェネレータの周期は6,953,607,871,644であり、2つの独立したランダムシーケンスがオーバーラップしないように注意する必要があるほど小さいです。
random.whseed([x])
これは廃止され、2.1より前のバージョンのPythonとのビットレベルの互換性のために提供されています。 詳細については、 seed()を参照してください。 whseed()は、個別の整数引数が個別の内部状態を生成することを保証するものではなく、合計で約2 ** 24個以下の個別の内部状態を生成できます。
class random.SystemRandom([seed])

os.urandom()関数を使用して、オペレーティングシステムによって提供されるソースから乱数を生成するクラス。 すべてのシステムで利用できるわけではありません。 ソフトウェアの状態に依存せず、シーケンスは再現できません。 したがって、 seed()および jumpahead()メソッドは効果がなく、無視されます。 getstate()および setstate()メソッドが呼び出されると、NotImplementedErrorが発生します。

バージョン2.4の新機能。

基本的な使用例:

>>> 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]

も参照してください

NS。 松本とT。 西村、「メルセンヌツイスター:623次元で等分配された均一疑似乱数ジェネレータ」、モデリングとコンピュータシミュレーションに関するACMトランザクションVol。 8、いいえ。 1、1月pp.3–301998。

ウィッチマン、B。 NS。 &ヒル、私。 D。、「Algorithm AS 183:効率的でポータブルな疑似乱数ジェネレータ」、Applied Statistics 31(1982)188-190。

Complementary-Multiply-with-Carryレシピは、長期間で比較的単純な更新操作を備えた互換性のある代替乱数ジェネレーターです。