Подтвердить что ты не робот

Насколько надежна функция Random в Delphi

Я пишу программу, которая пишет статистические тесты в Delphi (должен быть Delphi), и я слышал, что функциональность Random несколько странная. Вы должны вызвать рандомизацию, чтобы рандомизировать семя случайной функции при запуске программы.

Мне интересно, является ли случайная функция (после рандомизации) случайным образом для статистических тестов или нужен Mersenne twister? Кто-нибудь имеет представление о случайной фактической реализации, которая может сказать мне, насколько это важно?

4b9b3361

Ответ 1

Является ли Random достаточно надежным для ваших статистических тестов, будет зависеть от контекста, в котором вы собираетесь его использовать.

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

Если вы сомневаетесь, вы можете, конечно, статистически проанализировать результаты вызовов Random (например, в R, SPSS и т.д.) и проверить, нарушает ли распределение результатов требования распределения для вашего конкретного статистического теста (ов), [Если вы хороший ученый, это то, что вы должны делать в любом случае.]

Если вам нужны другие PRNG - например, библиотека TPMath содержит некоторые. (Для более вовлекаемых вещей есть также возможность вызывать сложные статистические функции из R через Delphi.)

Ответ 2

Delphi PRNG, как и почти все языки программирования RTL PRNG, является линейным конгруэнтным генератором.

Это достаточно хорошо для большинства мелких вещей, но есть вещи, на которые нужно следить. В частности, следите за младшими битами: шаблон умножения и добавления означает, что младшие разряды не очень случайны. Но это в целом относится только к большим 32-битным значениям, выведенным, а затем усеченным с mod или аналогичным. Использование Random(10) для вырезания значения между 0 и 9 внутренне использует умножение во всем 32-битном диапазоне, а не на операцию mod.

Ответ 3

alt text

Я не мог сопротивляться.

Ответ 5

Если вы не покупаете какое-то относительно эзотерическое оборудование, наилучшим приближением к случайным числам, которые может предоставить компьютер, является полностью детерминированная псевдослучайная последовательность. В общем случае функция рандомизации использует некоторое относительно случайное значение (часто основанное на времени, но иногда на движениях мыши - я не знаю, что делает Delphi) в качестве семени, которое обеспечивает точку входа в псевдослучайную последовательность. Без этого вы в конечном итоге получите один и тот же набор случайных чисел в том же порядке каждый раз, что в первую очередь приведет к победе в использовании случайных чисел.

Хорошо, я понимаю, что это не отвечает на вопрос о надежности, но это должно дать вам некоторую уверенность в том, что требование назвать случайным образом является признаком хорошего генератора, а не плохого. Существует множество статистических тестов, которые показывают, насколько случайна последовательность чисел, и вполне вероятно, что генератор случайных чисел Delphi подходит для многих целей, поскольку это зрелый продукт.

Ответ 6

Просто добавьте в пул возможностей - Windows предлагает ряд встроенных функций криптографии. Вероятно, для них также есть оболочка Delphi, если она по умолчанию не включена.

Среди этих функций также есть криптографически сильный генератор случайных чисел. Это, безусловно, лучшая случайность, которую вы получите в программном обеспечении, потому что она основывается на очень длинном списке факторов. Я не уверен, но я подозреваю, что он даже будет использовать генератор случайных чисел оборудования, если он у вас есть.

И если этого недостаточно, вы также можете попытаться зарегистрироваться в Quantum Random Bit Generator Service для некоторых ДЕЙСТВИТЕЛЬНОсильные > случайные значения.

Ответ 7

С веб-сайта Embarcadero:

_lrand - функция генератора длинных случайных чисел. _rand использует мультипликативный конгруэнтный генератор случайных чисел с периодом 2 ^ 64 для возврата последовательных псевдослучайных чисел в диапазоне от 0 до 2 ^ 31 - 1.

Генератор повторно инициализируется вызовом srand со значением аргумента 1. Его можно установить в новую начальную точку, вызвав srand с заданным количеством семян.

Ответ 8

Если они не изменили реализацию, так как я ее проанализировал (Delphi 4 IIRC), Delphi PRNG реализуется следующим образом:

Randseed:=int32(Randseed*$08088405)+1
result:=Randseed*Range shr 32

(Псевдокод/​​предполагаем, что умножения находятся на сколь угодно больших целых числах)

Ответ 9

Возврат случайного значения между 0..9

StrToInt(copy(FloatToStr(Random),4,1))

Примечание. Проверяйте длину FloatToStr (Random) перед использованием или используйте любую другую цифру из десятичной части...