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"` (равновероятный) или `"u"`
  - `"normal"` (нормальный) или `"n"`
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) mod M

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

a = 843314861
c = 453816693
M = 231

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

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

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

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

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

- grand
- ssrand
- sprand