# 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

  вещественный массив чисел двойной точности (double) размером m1 на m2 на ... со случайными элементами.

s

  матрица чисел двойной точности размером 1 на 1, целочисленное значение, положительное, семя генератора случайных чисел (по умолчанию `s=0`).

## Описание

Назначение данной функции в том, чтобы возвращать матрицу чисел двойной точности со случайными вещественными или комплексными элементами. В зависимости от входных аргументов, функция может возвращать матрицу случайных чисел двойной точности или может получать или устанавливать закон распределения случайных чисел, или может получать или устанавливать семя генератора случайных чисел.

## Генерация случайных чисел

r=rand()

  возвращает матрицу чисел двойной точности размером 1 на 1 с одним случайным значением.

r=rand(m1,m2)

  это матрица случайных чисел размером `m1` на `m2`.

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

  возвращает матрицу случайных чисел размером `m1` на `m2` на ... на `mn`.

r=rand(a)

  возвращает матрицу случайных чисел того же размера, что и `a`. Матрица `r` является вещественной, если `a` является вещественной и `r` является комплексной, если `a` является комплексной матрицей.

## Смена закона распределения случайных чисел

Входной аргумент `key` устанавливает закон распределения генерируемых случайных чисел.

rand("uniform")

  устанавливает генератор случайных чисел на генерацию случайных чисел по равновероятному закону. Случайные числа равномерно распределены на интервале (0,1).

rand("normal")

  устанавливает генератор случайных чисел на генерацию случайных чисел по нормальному (Гаусс-Лапласовскому) закону распределения, с математическим ожиданием 0 и дисперсией 1.

key=rand("info")

  возвращает текущий закон распределения генератора случайных чисел ("uniform" для равновероятного или "normal" для нормального).

## Получение или установка семени генератора случайных чисел

Есть возможность получить или установить семя генератора случайных чисел.

s=rand("seed")

  возвращает текущее значение семени.

rand("seed",s)

  устанавливает семя генератора случайных чисел равным `s` (по умолчанию `s=0` при первом вызове).

## Примеры

В следующем примере мы генерируем случайные числа двойной точности с различными законами распределения.

    // Получим одно случайное число (на основе текущего распределения)
    r=rand()

    // Получим матрицу размером 4 на 6 (на основе текущего распределения)
    r=rand(4,6)

    // Получим матрицу размером 4 на 6 со значениями элементов,
    // распределёнными по равновероятному закону распределения
    r=rand(4,6,"uniform")

    // Сформируем матрицу случайных чисел того же размера, что и x
    x=rand(4,4);
    r=rand(x,"normal")

    // Сформируем массив случайных чисел размером 2 на 2 на 2
    r=rand(2,2,2)

В следующем примере мы изменим закон распределения чисел, генерируемых функцией `rand`. Сначала генерируем числа по нормальному закону распределения, а затем числа но равновероятному закону на интервале [0,1).

        // настроим генератор случайных чисел на
        // нормальный закон распределения
        rand("normal")
        r=rand(4,6)
        // получим текущий закон распределения
        key=rand("info")

        // настроим генератор случайных чисел на
        // равновероятный закон распределения
        rand("uniform")
        r=rand(4,6)
        // получим текущий закон распределения
        key=rand("info")

В следующем примере мы сгенерируем матрицу комплексных чисел размером 2 на 3 по нормальному закону распределения.

        // формируем матрицу случайных комплексных чисел размером 2 на 3
        x=rand(2,3)+%i*rand(2,3)
        // Формируем матрицу случайных комплексных чисел по нормальному
        // закону распределения того же размера, что и x
        r=rand(x,"normal")

В следующем примере мы построим на графике распределение случайных равновероятных чисел, полученных `rand`.

        r=rand(1000,1,"uniform");
        scf();
        histplot(10,r);
        xtitle("Равновероятные числа из rand","X","Частота")

В следующем примере мы построим на графике распределение случайных чисел, сгенерированных `rand` по нормальному закону распределения.

        r=rand(1000,1,"normal");
        scf();
        histplot(10,r);
        xtitle("Случайные числа по нормальному закону распределения из","X","Частота")

## Получение более или менее предсказуемых чисел

Генератор псевдослучайных "равновероятных" чисел является детерминированной последовательностью, которая предназначена для воспроизводства независимых одинаково распределённых чисел, равновероятных на интервале (0,1).

Для того, чтобы получить повторяемые моделирования, начальное семя генератора случайных чисел равно нулю, так что последовательность будет оставаться одной и той же от одной сессии к другой. Иными словами, начальные числа, производимые `rand()`, всегда: 0.2113249, 0.7560439, ...

В некоторых случаях моделирования мы можем захотеть инициализировать семя генератора случайных чисел для того, чтобы получить менее предсказуемые последовательности. В этом случае мы можем инициализировать семя с помощью выходного значения функции `getdate`:

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

## Генератор

Генератор случайных "равновероятных" чисел описан в работе Майкла А. Малькольма, (Michael A. Malcolm), Клива Б. Молера (Cleve B. Moler) "Urand, A Universal Random Number Generator" (Urand, Универсальный Генератор Случайных Чисел), Stan-Cs-73-334, январь 1973, факультет информатики, кафедра гуманитарных и естественных наук Стенфордского университета.

Это линейный конгруэнтный генератор вида:

$$ x = (a x + c) \textrm{mod} M $$

где константами являются

\begin{eqnarray} a &=& 843314861\\ c &=& 453816693\\ M &=& 2^{31} \end{eqnarray}

Согласно авторам, этот генератор является генератором полной длины, иначе говоря, его период равен M=2^{31}=2147483648.

Генератор случайных чисел с нормальным распределением (`"normal"`) основан на методе Бокса-Мюллера, где источником равновероятных случайных чисел является Urand.

## Статистическое качество генератора

В функции grand доступны более лучшие генераторы случайных чисел в том смысле, что они имеют как более длинный период, так и более лучшие статистические свойства. В случае, когда качество случайных чисел имеет значение, следует использовать функцию `grand`. Более того, функция `grand` имеет больше возможностей.

## Смотрите также

- grand
- ssrand
- sprand