乱数配列の作成
R2026bMATLAB® は決定性アルゴリズムを使用して "疑似乱数" を生成します。これらの数値は、数学的な意味では真にランダムで独立したものではありませんが、ランダム性と独立性に関する統計検定に合格しており、テストや診断の目的で乱数列を再現できます。
関数 rand、randi、randn、および randperm は乱数の配列を作成するための基本関数です。rng 関数では、乱数を発生させるシードとアルゴリズムを制御できます。
乱数発生
rand 関数、randi 関数、randn 関数、および randperm 関数を使用して、さまざまなタイプの分布に従う乱数を発生させることができます。rand 関数は、一様分布から得た 0 ~ 1 の浮動小数点の乱数を発生させます。たとえば、一様分布から得た実浮動小数点数からなる 10,000 行 1 列の列ベクトルを作成します。
rng("default")
n = 10000;
r1 = rand(n,1);r1 の値はすべて、開区間 (0,1) の範囲内にあります。これらの値のヒストグラムをプロットします。ヒストグラムは概ね平坦であり、値の標本が一様分布に従っていることを示しています。histogram(r1) xlabel("Value") ylabel("Counts") title("Histogram of rand(" + n + ",1)")
randi 関数は、離散一様分布から得た double の整数乱数値を発生させます。たとえば、離散一様分布から得た、閉区間 [1,10] の整数値からなる 10,000 行 1 列の列ベクトルを作成します。
n = 10000; r2 = randi(10,n,1);
histogram(r2) xlabel("Value") ylabel("Counts") title("Histogram of randi(10," + n + ",1)")
randn 関数は、標準正規分布から得た実浮動小数点の乱数を発生させます。たとえば、標準正規分布から得た数値からなる 20,000 行 1 列の列ベクトルを作成します。
n = 20000; r3 = randn(n,1);
histogram(r3) xlabel("Value") ylabel("Counts") title("Histogram of randn(" + n + ",1)")
randperm 関数は、繰り返しの値のない整数の乱数からなる double 配列を生成します。たとえば、区間 [1,15] からランダムに選択された整数からなる 1 行 10 列の配列を作成します。
r4 = randperm(15,10);
randi とは異なり、randperm は繰り返しの値のない配列を返します。これらの値のヒストグラムをプロットします。各整数はヒストグラムに最大で 1 回しか現れません。histogram(r4) xticks(1:15) xlim([0 16]) yticks([0 1]) xlabel("Value") ylabel("Counts") title("Histogram of randperm(15,10)")
これらの関数はいずれも、連続で呼び出すと異なる結果を返します。乱数値からなる異なる配列を作成する場合に、この動作は便利です。
乱数シードおよび発生器の指定
rng 関数を使用して、rand 関数、randi 関数、randn 関数、および randperm 関数が使用するシードと発生器アルゴリズムを設定できます。シードは乱数発生器の初期状態を設定し、乱数列を再現できるようにします。発生器アルゴリズムは、乱数列を生成するために使用されるアルゴリズムを決定します。
MATLAB では、次の表に記載されている発生器アルゴリズムが用意されています。
| 名前 | 説明 |
|---|---|
"twister" (既定) | メルセンヌ・ツイスター |
"combRecursive" | 結合多重再帰発生器 |
"multFibonacci" | 乗法ラグ フィボナッチ発生器 |
| 二重 xor-shift 乗算を使用する、64 ビットの置換された合同法発生器 |
"philox" | Philox 4x32 発生器、10 ラウンド |
"simdTwister" | SIMD 指向高速メルセンヌ・ツイスター |
"threefry" | Threefry 4x64 発生器、20 ラウンド |
| 256 ビットの状態を持ち、二重加算を行う Xor-shift-rotate 生成器 |
関数 rng を使用して、関数 rand、randi、randn、および randperm で使用されるシードと発生器を設定します。
たとえば、rng(0,"twister") はシードを 0 に、乱数発生器アルゴリズムをメルセンヌ・ツイスターに設定します。MATLAB の再起動時に乱数配列の繰り返しを回避するには、起動後に乱数が繰り返される理由を参照してください。
同じ乱数を使用して計算を反復できるように、あるいは反復計算で必ず異なる乱数が使用されるように乱数発生器の状態を制御する方法の詳細については、Control Random Number Generationを参照してください。
MATLAB の [設定] ウィンドウから乱数発生器の既定のシードおよびアルゴリズムを変更できます。 (R2023b 以降)該当する設定を変更しなかった場合、rng は、出荷時の値としてメルセンヌ・ツイスター発生器の "twister"、シード 0 を使用します。詳細については、乱数発生器の既定の設定と乱数発生器の再現性を参照してください。
乱数のデータ型の指定
rand 関数と randn 関数は、既定では倍精度の値を生成します。
rng("default")
A = rand(1,5)A = 1×5
0.8147 0.9058 0.1270 0.9134 0.6324乱数のデータ型を明示的に指定することもできます。たとえば、データ型を double として指定します。
rng("default") B = rand(1,5,"double")
B = 1×5
0.8147 0.9058 0.1270 0.9134 0.6324tf = isequal(A,B)
ans = logical 1
rand と randn は単精度の値を生成することもできます。
rng("default") A_single = rand(1,5,"single")
A_single = 1×5 single row vector
0.8147 0.9058 0.1270 0.9134 0.6324これらの値は、前の例の倍精度の値を単精度にキャストした場合と同じです。rand 関数が値を引き出す乱数ストリームは、出力データ型に関係なく、同じように進行します。
B_single = cast(B,"single");
isequal(A_single,B_single)ans = logical 1
randi 関数では、単精度型と倍精度型に加え、int64 と uint64 を除くすべての整数型がサポートされています。
A = randi([1 10],1,5,"double")A = 1×5
1 3 6 10 10B_uint8 = randi([1 10],1,5,"uint8")B_uint8 = 1×5 uint8 row vector
2 10 10 5 9参考
rng | rand | randi | randn | randperm