реализация рэнда ()

Большинство генераторов случайных чисел фактически являются «псевдослучайными». Это линейные конгруэнтные генераторы или LCG ( http://en.wikipedia.org/wiki/Linear_congruential_generator )

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

19
задан Craig McQueen 2 July 2012 в 02:57
поделиться

8 ответов

Посмотрите эту коллекцию генераторов случайных чисел от Джорджа Марсальи. Он ведущий эксперт в области генерации случайных чисел, поэтому я буду уверен, используя все, что он рекомендует. Генераторы в этом списке крошечные, для некоторых требуется всего пара беззнаковых long в качестве состояния.

Генераторы Marsaglia определенно «высокого качества» по вашим стандартам длительного периода и хорошего равномерного распределения. Они проходят строгие статистические тесты, но не подходят для криптографии.

23
ответ дан 30 November 2019 в 02:45
поделиться

Используйте код C для LFSR113 от L'écuyer :

unsigned int lfsr113_Bits (void)
{
   static unsigned int z1 = 12345, z2 = 12345, z3 = 12345, z4 = 12345;
   unsigned int b;
   b  = ((z1 << 6) ^ z1) >> 13;
   z1 = ((z1 & 4294967294U) << 18) ^ b;
   b  = ((z2 << 2) ^ z2) >> 27; 
   z2 = ((z2 & 4294967288U) << 2) ^ b;
   b  = ((z3 << 13) ^ z3) >> 21;
   z3 = ((z3 & 4294967280U) << 7) ^ b;
   b  = ((z4 << 3) ^ z4) >> 12;
   z4 = ((z4 & 4294967168U) << 13) ^ b;
   return (z1 ^ z2 ^ z3 ^ z4);
}

Очень качественно и быстро. Это хуже, чем бесполезно.

11
ответ дан 30 November 2019 в 02:45
поделиться
4
ответ дан 30 November 2019 в 02:45
поделиться

Я рекомендую научную статью Две быстрые реализации генератора минимальных стандартных случайных чисел Дэвида Хартии. Вы можете найти бесплатный PDF через Google. Также стоит прочитать оригинальную статью о генераторе минимальных стандартных случайных чисел

. Код Carta дает быстрые высококачественные случайные числа на 32-битных машинах. Для более полной оценки см. Статью.

2
ответ дан 30 November 2019 в 02:45
поделиться

Твистер Мерсенна

Немного из Википедии:

  • Он был разработан с точкой of 2 19937 - 1 (это свойство доказали создатели алгоритма). На практике нет особых причин использовать больший период, так как для большинства приложений не требуется 2 19937 уникальных комбинаций (2 19937 приблизительно равно 4,3 × 10 6001 ; это на много порядков больше, чем предполагаемое количество частиц в наблюдаемой Вселенной, которое составляет 10 80 ).
  • Оно имеет очень высокий порядок размерного равнораспределения (см. линейный конгруэнтный генератор). Это означает, что существует незначительная последовательная корреляция между последовательными значениями в выходной последовательности.
  • Он проходит многочисленные тесты на статистическую случайность, включая тесты Дихарда. Он проходит большинство, но не все, даже более строгие тесты на случайность TestU01 Crush.

  • исходный код для многих языков доступен по ссылке.

2
ответ дан 30 November 2019 в 02:45
поделиться

Я бы взял один из библиотеки GNU C, исходный код доступен для просмотра в Интернете.

http://qa.coreboot.org/docs/libpayload /rand_8c-source.html

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

Вот еще одна возможность: http://www.boost.org/doc/libs/1_39_0/ libs / random / index.html

(Если вы обнаружите, что у вас слишком много вариантов,

1
ответ дан 30 November 2019 в 02:45
поделиться

Я нашел это: Генерация простых случайных чисел , автор John D. Cook .

Это должно быть легко адаптироваться к C, учитывая, что это только несколько строк кода.

Edit: и вы могли бы пояснить, что вы подразумеваете под «относительно высоким качеством». Вы генерируете ключи шифрования для кодов ядерных запусков или случайные числа для игры в покер?

1
ответ дан 30 November 2019 в 02:45
поделиться

Стандартным решением является использование сдвигового регистра с линейной обратной связью .

0
ответ дан 30 November 2019 в 02:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: