Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

乱数配列の作成

MATLAB® はアルゴリズムを使用して "疑似乱数""疑似独立" の数値を生成します。これらの数値は、数学的な意味では厳密にランダムで独立してはいませんが、ランダム性と独立性に関する各種の統計検定に合格しており、その計算は検定や診断の目的で繰り返すことができます。

関数 randrandirandn、および randperm は乱数の配列を作成するための基本関数です。関数 rng では、乱数を発生させるシードとアルゴリズムを制御することができます。

乱数関数

基本的な乱数関数には、randrandirandnrandperm の 4 つがあります。関数 rand は、一様分布から得た 0 ~ 1 の浮動小数点数を返します。たとえば、一様分布から得た実浮動小数点数からなる 1000 行 1 列の列ベクトルを作成します。

rng("default")
r1 = rand(1000,1);
r1 の値はすべて、開区間 (0,1) の範囲内にあります。これらの値のヒストグラムはほぼ平坦であり、数値がかなり一様にサンプリングされていることを示します。

関数 randi は離散一様分布から得た double の整数値を返します。たとえば、離散一様分布から得た整数値からなる 1000 行 1 列の列ベクトルを作成します。

r2 = randi(10,1000,1);
r2 の値はすべて、閉区間 [1, 10] の範囲内にあります。これらの値のヒストグラムはほぼ平坦であり、1 ~ 10 の整数がかなり一様にサンプリングされていることを示します。

関数 randn は、標準正規分布から得た実浮動小数点数の配列を返します。たとえば、標準正規分布から得た数値からなる 1000 行 1 列の列ベクトルを作成します。

r3 = randn(1000,1);
r3 のヒストグラムは平均値 0、標準偏差 1 の正規分布とほぼ同様になります。

関数 randperm を使用すると、繰り返しの値を含まない乱数の整数値からなる double 配列を作成できます。たとえば、範囲 [1, 15] からランダムに選択された整数からなる 1 行 5 列の配列を作成します。

r4 = randperm(15,5);
繰り返しの値を含む配列を返す可能性がある randi とは異なり、randperm が返す配列に繰り返しの値はありません。

これらの関数はいずれも、連続で呼び出すと異なる結果を返します。乱数からなる異なる配列をいくつか作成する場合に、この動作は便利です。

乱数発生器

MATLAB には、発生器アルゴリズムのオプションがいくつか用意されています。次の表は、これらをまとめたものです。

発生器の名前発生器のキーワード
"twister"メルセンヌ・ツイスター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 を使用して、関数 randrandirandn、および randperm で使用されるシードと発生器を設定します。

たとえば、rng(0,"twister") はシードを 0 に、乱数発生器アルゴリズムをメルセンヌ・ツイスターに設定します。MATLAB の再起動時に乱数配列の繰り返しを回避するには、起動後に乱数が繰り返される理由を参照してください。

同じ乱数を使用して計算を反復するよう、あるいは反復計算で必ず異なる乱数が使用されるよう乱数発生器の状態を制御する方法の詳細については、乱数発生器の制御を参照してください。

R2023b 以降では、MATLAB の基本設定で既定のアルゴリズムとシードを設定できます。該当する基本設定を変更しなかった場合、rng は、以前のリリースと同様に、出荷時の値としてメルセンヌ・ツイスター発生器の "twister"、シード 0 を使用します。詳細については、乱数発生器の既定の設定乱数発生器の再現性を参照してください。

乱数のデータ型

関数 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

randrandn は単精度の値を生成することもできます。

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'

参考

| | | |

関連するトピック