乱数配列の作成
MATLAB® はアルゴリズムを使用して "疑似乱数" で "疑似独立" の数値を生成します。これらの数値は、数学的な意味では厳密にランダムで独立してはいませんが、ランダム性と独立性に関する各種の統計検定に合格しており、その計算は検定や診断の目的で繰り返すことができます。
関数 rand
、randi
、randn
、および randperm
は乱数の配列を作成するための基本関数です。関数 rng
では、乱数を発生させるシードとアルゴリズムを制御することができます。
乱数関数
基本的な乱数関数には、rand
、randi
、randn
、randperm
の 4 つがあります。関数 rand
は、一様分布から得た 0 ~ 1 の浮動小数点数を返します。以下に例を示します。
rng('default')
r1 = rand(1000,1);
r1
は一様分布から得た実浮動小数点数からなる 1000 行 1 列の列ベクトルです。r1
の値はすべて、開区間 (0, 1) の範囲内にあります。これらの値のヒストグラムはほぼ平坦であり、数値がかなり一様にサンプリングされていることを示します。関数 randi
は離散一様分布から得た double
の整数値を返します。以下に例を示します。
r2 = randi(10,1000,1);
r2
は、範囲が閉区間 [1, 10] の離散一様分布から得た整数値からなる 1000 行 1 列の列ベクトルです。これらの値のヒストグラムはほぼ平坦であり、1 ~ 10 の整数がかなり一様にサンプリングされていることを示します。 関数 randn
は、標準正規分布から得た実浮動小数点数の配列を返します。以下に例を示します。
r3 = randn(1000,1);
r3
は標準正規分布から得た数値からなる 1000 行 1 列の列ベクトルです。r3
のヒストグラムは平均値 0、標準偏差 1 の正規分布とほぼ同様になります。関数 randperm
を使用すると、繰り返しの値を含まない乱数の整数値からなる double
配列を作成できます。以下に例を示します。
r4 = randperm(15,5);
r4
は、範囲 [1, 15] からランダムに選択された整数からなる 1 行 5 列の配列です。繰り返しの値を含む配列を返す可能性がある randi
とは異なり、randperm
が返す配列に繰り返しの値はありません。これらの関数はいずれも、連続で呼び出すと異なる結果を返します。乱数からなる異なる配列をいくつか作成する場合に、この動作は便利です。
乱数発生器
MATLAB には、発生器アルゴリズムのオプションがいくつか用意されています。次の表は、これらをまとめたものです。
値 | 発生器の名前 | 発生器のキーワード |
---|---|---|
'twister' | メルセンヌ・ツイスター (MATLAB 起動時に既定のストリームによって使用) | mt19937ar |
'simdTwister' | SIMD 指向高速メルセンヌ・ツイスター | dsfmt19937 |
'combRecursive' | 複数の再帰発生器の組み合わせ | mrg32k3a |
'multFibonacci' | 乗法ラグ フィボナッチ | mlfg6331_64 |
'philox' | Philox 4x32 発生器、10 ラウンド | philox4x32_10 |
'threefry' | Threefry 4x64 発生器、20 ラウンド | threefry4x64_20 |
'v4' | レガシ MATLAB Version 4.0 発生器 | mcg16807 |
'v5uniform' | レガシ MATLAB Version 5.0 一様分布発生器 | swb2712 |
'v5normal' | レガシ MATLAB Version 5.0 正規分布発生器 | shr3cong |
関数 rng
を使用して、関数 rand
、randi
、randn
、および randperm
で使用されるシードと発生器を設定します。たとえば、rng(0,'twister')
は発生器を既定の状態にリセットします。MATLAB の再起動時に乱数配列の繰り返しを回避するには、起動後に乱数が繰り返される理由を参照してください。
同じ乱数を使用して計算を反復するよう、あるいは反復計算で必ず異なる乱数が使用されるよう乱数発生器の状態を制御する方法の詳細については、乱数発生器の制御を参照してください。
乱数のデータ型
関数 rand
と関数 randn
は、既定では倍精度の値を生成します。
rng('default')
A = rand(1,5);
class(A)
ans = 'double'
クラスを倍精度に明示的に指定するには、以下のようにします。
rng('default') B = rand(1,5,'double'); class(B)
ans = 'double'
isequal(A,B)
ans = 1
rand
と randn
は単精度の値を生成することもできます。
rng('default') A = rand(1,5,'single'); class(A)
ans = 'single'
上の例の結果に倍精度値を入力しても出力値は等価です。関数が値を引き出す乱数ストリームは、戻る値のクラスに関係なく、同じ方法を実行します。
A,B
A = 0.8147 0.9058 0.1270 0.9134 0.6324 B = 0.8147 0.9058 0.1270 0.9134 0.6324
randi
は単精度/倍精度と整数のタイプをサポートしています。
A = randi([1 10],1,5,'double');
class(A)
ans = 'double'
B = randi([1 10],1,5,'uint8');
class(B)
ans = 'uint8'
参考
rng
| rand
| randi
| randn
| randperm