rand 乱数生成

## 呼び出し手順

                r = rand()

                r = rand(m1,m2,...)

                r = rand(m1,m2,...,key)

                r = rand(x)

                r = rand(x,key)

                s = rand("seed")

                rand("seed",s)

                rand(key)

                key = rand("info")

## 引数

m1, m2, ...

  整数, ランダム行列`r`の大きさ.

key

  文字列, 乱数の分布 (デフォルト `key="uniform"` ). 利用可能な値は `"uniform"` および `"normal"`です.

x

  実数または複素数の行列. 実数または複素数の内容とその次元のみが処理されます.

r

  m1 x m2 x... ランダムなエントリを有するdoubleの実数配列.

s

  1行1列double行列, 整数値, 正, シード (デフォルト `s=0`).

## 説明

この関数の目的は,実数または複素数のランダムなエントリを有するdoubleの行列 を返すことです. 入力引数に依存して,この関数はdoubleのランダム行列を返したり,または, 乱数の分布を取得または設定したり, 乱数生成器のシードを取得または設定したりできます.

## 乱数生成器

r=rand()

  乱数1個を有する1行1列double行列を返します.

r=rand(m1,m2)

  は, 次元が `m1` 行 `m2`列のランダム行列です.

r=rand(m1,m2,..,mn)

  は,次元が`m1` x `m2`,.. x `mn` のランダム行列を返します.

r=rand(a)

  は,aと同じ大きさのランダム行列を返します. `a`が実数行列の場合, `r`は実数, `a`が複素数行列の場合, `r`は複素数です.

## 乱数の分布の変更

入力引数`key` は乱数生成器の分布を設定します.

rand("uniform")

  乱数生成器が一様分布の乱数生成器に 設定されます.乱数は[0,1)の範囲の一様分布となります.

rand("normal")

  乱数生成器がガウス乱数生成器(平均0,分散1)に設定されます.

key=rand("info")

  カレントの乱数生成器の型("uniform" または "normal")を返します.

## シートの取得または設定

乱数生成器のシードを取得または設定することが可能です.

s=rand("seed")

  カレントのシードの値を返します.

rand("seed",s)

  シードを`n`に設定します. (デフォルトでは, 最初のコールで`s=0` ).

## 例

以下の例では, 様々な分布を有するランダムdoubleを生成します.

    // Get one random double (based on the current distribution)
    r=rand()
    // Get one 4-by-6 matrix of doubles (based on the current distribution)
    r=rand(4,6)
    // Get one 4-by-6 matrix of doubles with uniform entries
    r=rand(4,6,"uniform")
    // Produce a matrix of random doubles with the same size as x
    x=rand(4,4);
    r=rand(x,"normal")
    // Produce a 2-by-2-by-2 array of random doubles
    r=rand(2,2,2)

以下の例では, `rand`により生成された 数の分布を変更します. まず正規分布を作成した後, 一様分布 [0,1)を作成します.

        // Set the rand generator to normal
        rand("normal")
        r=rand(4,6)
        // Get the current distribution
        key=rand("info")
        // Set the rand generator to uniform
        rand("uniform")
        r=rand(4,6)
        key=rand("info")

以下の例では,正規分布の2行3列のdouble複素数行列を作成します.

        // Produce a 2-by-3 matrix of random complex doubles
        x=rand(2,3)+%i*rand(2,3)
        // Produce a matrix of random complex doubles with
        // normal entries and the same size as x
        r=rand(x,"normal")

以下の例では, `rand`により生成された一様分布の数値をプロットします.

        r=rand(1000,1,"uniform");
        scf();
        histplot(10,r);
        xtitle("Uniform numbers from rand","X","Frequency")

以下の例では, `rand`により生成された標準正規分布の数値をプロットします.

        r=rand(1000,1,"normal");
        scf();
        histplot(10,r);
        xtitle("Normal numbers from rand","X","Frequency")

## 予測可能または予測困難な数を取得

"uniform" 擬似乱数生成器は, 範囲[0,1)において独立して一様分布する 数を再現することを目的とする決定論的数列です.

再現可能なシミュレーションを行うには, 数列がセッション間で同じであるように,生成器の初期シードをゼロにします. 言い換えると, `rand()`により生成される最初の数は, 常に 0.2113249, 0.7560439, ... となります.

いくつかのケースでは, より予測しくい数列を出力するように生成器のシードを初期化したい場合があります. この場合,以下のように`getdate`関数の出力で 初期化することができます:

    n=getdate("s");
    rand("seed",n);

## 生成器

`"uniform"` 乱数生成器は "Urand, A Universal Random Number Generator" において Michael A. Malcolm, Cleve B. Moler, Stan-Cs-73-334, January 1973, Computer Science Department, School Of Humanities And Sciences, Stanford University により記述されています.

これは,以下の形式の線形共役生成器です :

x = (a x + c) mod M

ただし,定数を以下に示します

a = 843314861
c = 453816693
M = 231

著者によれば,この生成器はフルレングス生成器であり, つまり,周期はM=231=2147483648です.

`"normal"` 乱数生成器は Box-Muller 法に 基づいており, 一様乱数のソースは Urand です.

## 生成器の統計的品質

より長い周期とより良い統計的特性を有するという意味で, より優れた乱数生成器が grand関数で利用可能です. 乱数の品質が問題となる場合,代わりに `grand` 関数を検討するべきです. 更に,`grand` にはより多くの機能があります.

## 参照

- grand
- ssrand
- sprand