擬似乱数

Wolfram言語には値上に一様分布する擬似乱数を生成するための関数が3つある.

RandomInteger[]確率をとした0または1
RandomInteger[{imin,imax}] の間の整数の擬似乱数(それぞれを含む)
RandomInteger[imax]0と の間の整数の擬似乱数(それぞれを含む)
RandomReal[ ]0から1の間の実数値を取る擬似乱数
RandomReal[{x_(min), x_(max)}] の間の実数の擬似乱数
RandomReal[x_(max)]0と の間の実数擬似乱数
RandomComplex[]単位平方の複素数擬似乱数
RandomComplex[{zmin,zmax}] で定義される長方形範囲内の複素数擬似乱数
RandomComplex[z_(max)]0と で定義される長方形範囲内の複素数擬似乱数

擬似乱数の生成

RandomReal[range,n], RandomComplex[range,n], RandomInteger[range,n]
指定された範囲にある n 個の擬似乱数のリスト
RandomReal[range,{n1,n2,}], RandomComplex[range,{n1,n2,}], RandomInteger[range,{n1,n2,}]
擬似乱数の ××配列

擬似乱数表の生成

等しい確率で0か1を与える.
In[1]:=
Click for copyable input
Out[1]=
複素数の擬似乱数を与える.
In[2]:=
Click for copyable input
Out[2]=
0と9の間(それぞれを含む)の整数の擬似乱数10個のリストを与える.
In[3]:=
Click for copyable input
Out[3]=
0と1の間の実数の擬似乱数行列を与える.
In[4]:=
Click for copyable input
Out[4]=

RandomRealRandomComplexを使うと,任意精度の擬似乱数を得ることができる.

オプション名
デフォルト値
WorkingPrecisionMachinePrecision実数または複素数に使用する精度

擬似乱数の精度の変更

30桁の実数値からなる乱数を発生させる.範囲を0から1に限る.
In[5]:=
Click for copyable input
Out[5]=
次は20桁の複素数の擬似乱数のリストである.
In[6]:=
Click for copyable input
Out[6]=

擬似乱数を繰返し発生させると,特定なパターンに従わない「典型的な」,つまり一般的な数列を得ることができる.このような乱数列は各種の計算用途で使われる.

擬似乱数の一般的な用途として,仮定の数値的な判定への応用がある.例えば,2つのシンボル式が数学的に等しいかどうかを判定するとする.これは,「典型的な」数値をシンボル的パラメータに代入し,数値的な2つの結果を比較することで行うことができる.(ただし,数値精度の問題や,多価複素関数を扱った問題では,このような比較の解釈には注意を要する.)

シンボル的な等式を入力する.
In[7]:=
Click for copyable input
Out[7]=
乱数を代入すると,この等式が常にTrueであるとは限らないことが分かる.
In[8]:=
Click for copyable input
Out[8]=

擬似乱数の他の一般的用途として,確率的現象のシミュレーションやサイズの大きい母集団からの標本抽出がある.Wolfram言語が数の範囲に対して生成する乱数は,指定された範囲で必ず一様に分布するようになっている.

関数RandomIntegerRandomRealRandomComplexは他のほとんどのWolfram言語組込み関数と違った特徴を持っている.つまり,使われるたびに潜在的な出力値は違ってくる.従って,これらを計算でを使うと,答は使うたびに違ってくる.

RandomIntegerRandomRealRandomComplexで得られる数列は厳密には「真の乱数」ではないが,実用上「十分に乱数的」である.乱数列は,特定の「種(シード)」を開始点として,特定の数学アルゴリズムを適用することで生成される.同じシードが与えられたなら,同じ乱数からなる系列が得られる.

Wolfram言語が起動されたときの時間が(秒以下の精度で記録される)読み込まれ,擬似乱数ジェネレータのシードとして保存される.このため,Wolfram言語を別に起動すれば,擬似乱数列はほとんどいつでも違うものになる.

ここで,毎回必ず同じ乱数系列を使いたいのであれば,同じシードをその都度添加する.このように特別にシードの添加を行うにはSeedRandomを使う.

SeedRandom[]その日の時間で,擬似乱数ジェネレータを再びシードする
SeedRandom[s]整数 s で再びシードする

擬似乱数ジェネレータのシード

擬似乱数ジェネレータにシードを添加し直す.
In[9]:=
Click for copyable input
3つの擬似乱数を発生させる.
In[10]:=
Click for copyable input
Out[10]=
同じシードを再添加する.すると,前と同じ乱数列が得られる.
In[11]:=
Click for copyable input
Out[11]=

RandomIntegerRandomRealRandomComplexが呼び出されるたびに,それに対応する擬似乱数ジェネレータの内部状態は変わる.従属的な計算でこれらの関数を続けて呼び出すと,主計算に返される数に影響が出るかもしれない.これを防ぐには,BlockRandomの内部で計算を実行することにより関数の使用による影響を局所的なものにするとよい.

BlockRandom[expr]擬似乱数ジェネレータの現在の状態を局所化して,expr を評価する

RandomIntegerRandomRealRandomComplexを使う効果を局所化する

BlockRandom内部の計算を局所化することで,リストが生成された後に,擬似乱数ジェネレータの内部状態を復元することができる.
In[12]:=
Click for copyable input
Out[12]=

多くの分野で,非一様分布からの乱数が必要とされる.Wolfram言語には多くの分布が組み込まれている.RandomIntegerRandomRealに対する範囲の代りに適切なパラメータで分布を生成することができる.

RandomInteger[dist], RandomReal[dist]
乱数分布 dist により分布した擬似乱数
RandomInteger[dist,n], RandomReal[dist,n]
乱数分布 dist により分布した n 個の擬似乱数のリスト
RandomInteger[dist,{n1,n2,}], RandomReal[dist,{n1,n2,}]
乱数分布 dist により分布した擬似乱数の ××配列

非一様分布による擬似乱数の生成

平均3のポアソン分布で分布する12個の整数を生成する.
In[13]:=
Click for copyable input
Out[13]=
正規分布を使って実数の4×4行列を生成する.
In[14]:=
Click for copyable input
Out[14]=
平均2,標準偏差4の正規分布により分布した5つの高精度の実数を生成する.
In[15]:=
Click for copyable input
Out[15]=

リストからの選択するためにも,擬似乱数を使うことができる.RandomChoiceは代替付きで選択し,RandomSampleは代替なしで選択する.

RandomChoice[list, n]list から無作為に n 個の項目を選ぶ
RandomChoice[list,{n1,n2,}]list から無作為に選ばれた値の ××配列
RandomSample[list, n]list から n を抽出する

無作為の選択

数0から9までの中から無作為に10個選ぶ.
In[16]:=
Click for copyable input
Out[16]=

選択肢の中の少なくとも1つは出力に繰り返される確率が非常に高い.これは,要素が選ばれると,それが直ちに補充されるからである.しかし,実際の要素の集合から選ぶ場合は,補充はない.

0から9までの中から,補充なしで10個抽出する.この結果,数のランダムな組み合わせとなる.
In[17]:=
Click for copyable input
Out[17]=
異なる頻度を持つ数の集合から10個抽出する.
In[18]:=
Click for copyable input
Out[18]=