Вопрос

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

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

Это было полезно?

Решение

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

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

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

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

Другие советы

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

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

alt text

Я не мог устоять.

Если вы ищете способ гарантировать уникальность случайных чисел с самым быстрым временем исполнения, About.com. создал вызов на Самый быстрый уникальный генератор случайных чисел, а также Реализация Патрика Ван Логчита был избран как победитель.

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

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

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

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

И если этого недостаточно, вы также можете попытаться подписаться на Quantum случайно-битный генератор для некоторых В САМОМ ДЕЛЕ случайные значения.

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

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

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

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

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

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

Вернуть случайные между 0..9

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top