Большинство генераторов случайных чисел фактически являются «псевдослучайными». Это линейные конгруэнтные генераторы или LCG ( http://en.wikipedia.org/wiki/Linear_congruential_generator )
LCG вполне предсказуемы при фиксированном начальном числе. В основном, используйте начальное число, которое дает вам ваше первое письмо, затем напишите приложение, которое продолжает генерировать следующее целое число (символ), пока вы не нажмете следующую букву в вашей целевой строке и не запишите, сколько раз вам приходилось вызывать LCG. Продолжайте, пока вы не сгенерируете каждую букву.
Посмотрите эту коллекцию генераторов случайных чисел от Джорджа Марсальи. Он ведущий эксперт в области генерации случайных чисел, поэтому я буду уверен, используя все, что он рекомендует. Генераторы в этом списке крошечные, для некоторых требуется всего пара беззнаковых long в качестве состояния.
Генераторы Marsaglia определенно «высокого качества» по вашим стандартам длительного периода и хорошего равномерного распределения. Они проходят строгие статистические тесты, но не подходят для криптографии.
Используйте код 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);
}
Очень качественно и быстро. Это хуже, чем бесполезно.
Вот ссылка на ANSI C реализацию нескольких генераторов случайных чисел .
Я рекомендую научную статью Две быстрые реализации генератора минимальных стандартных случайных чисел Дэвида Хартии. Вы можете найти бесплатный PDF через Google. Также стоит прочитать оригинальную статью о генераторе минимальных стандартных случайных чисел
. Код Carta дает быстрые высококачественные случайные числа на 32-битных машинах. Для более полной оценки см. Статью.
Немного из Википедии:
Он проходит многочисленные тесты на статистическую случайность, включая тесты Дихарда. Он проходит большинство, но не все, даже более строгие тесты на случайность TestU01 Crush.
исходный код для многих языков доступен по ссылке.
Я бы взял один из библиотеки 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
(Если вы обнаружите, что у вас слишком много вариантов,
Я нашел это: Генерация простых случайных чисел , автор John D. Cook .
Это должно быть легко адаптироваться к C, учитывая, что это только несколько строк кода.
Edit: и вы могли бы пояснить, что вы подразумеваете под «относительно высоким качеством». Вы генерируете ключи шифрования для кодов ядерных запусков или случайные числа для игры в покер?