Как генерировать равномерно распределенные случайные числа от 0 до 1 в Delphi

#delphi #random #uniform-distribution

#delphi #Случайный #равномерное распределение

Вопрос:

В Matlab эта функция

 r = rand(5)
  

Результат:

 r =

0.8147    0.0975    0.1576    0.1419    0.6557
0.9058    0.2785    0.9706    0.4218    0.0357
0.1270    0.5469    0.9572    0.9157    0.8491
0.9134    0.9575    0.4854    0.7922    0.9340
0.6324    0.9649    0.8003    0.9595    0.6787
  

используется для генерации матрицы 5 на 5 равномерно распределенных случайных чисел от 0 до 1.

Какова эквивалентная функция в Delphi?

Ответ №1:

Не существует стандартной функции Delphi RTL, которая будет генерировать матрицу или любой другой набор случайных чисел.

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

В Delphi матрица 5×5 может быть представлена несколькими способами, одним из которых может быть простой двумерный массив, который может быть инициализирован в простом цикле:

 var
  x, y: Integer;
  r: array[0..4, 0..4] of Double;
begin
  for x := 0 to 4 do
    for y := 0 to 4 do
      r[x][y] := Random;

  // etc to work with the matrix (array)...

end;
  

Как и в большинстве языков программирования / сред выполнения, по умолчанию при каждом запуске программы будет выдаваться одна и та же последовательность случайных чисел. Чтобы изменить «начальное значение» и получить другую последовательность, вы можете либо вызвать Randomize , либо установить RandSeed переменную (вы получите ту же последовательность чисел для заданного значения RandSeed ).

Random Функция возвращает случайное значение от 0.0 до 1.0, выбранное из равномерного распределения.

Генератор псевдослучайных чисел (PRNG), используемый Delphi, представляет собой простой линейный конгруэнтный генератор, очень простой и не обладающий очень хорошими свойствами как PRNG. Matlab использует гораздо лучший PRNG, по умолчанию используется Mersenne Twister. Если для вас важно качество псевдослучайных чисел, то вам нужно будет выбрать конкретный алгоритм и либо реализовать его самостоятельно, либо найти в подходящей библиотеке, которых существует множество.

Комментарии:

1. Распределение равномерное, но это не очень хороший PRNG. Matlab не создает и не хранит значения, округленные до 4dp. Именно так они и отображаются. Моя правка пытается прояснить все это.