Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Дмитро, Вы писали:
А>А как заставить её генерить числа больше чем 7fff? Переоределиение MAX_RAND не помогло.
Я бы сделал так:
long randtwice() {
return rand()*MAX_RAND+rand();
}
Код, который привел я — реализация линейного конгруэнтного метода (Д.Кнут, том 2):
Xn+1 = (aXn + c) mod m, n >= 0
m - модуль, 0 < m
a - множитель, 0 <= a < m
c - приращение, 0 <= c < m
X0 - начальное значение 0x <= X0 < m
Чистла m, a и с должны быть тщательно подобраны для получения макимальных периода и потенциала. a == 1664525 и c == 1013904223 при m == 2 ^ 32 подобрал Кнут.
Да, но только в том случае, если период -- четное число. А для того, чтобы сделать период нечетным, достаточно выбросить из рассмотрения какое-нибудь случайное число (просто пропускать его при генерации). При этом период уменьшится только на единицу.
A>Ты скоратил повторяемость в 2 раза,
Д>для того, чтобы сделать период нечетным, достаточно выбросить из рассмотрения какое-нибудь случайное число (просто пропускать его при генерации). При этом период уменьшится только на единицу.
return rand()*MAX_RAND+(rand() ^ rand())
Даст неплохой результат и по распределению и по независимости.
int random()
{
static int iran = 0;
iran = 1664525L * iran + 1013904223L;
return iran;
}
Оказался достаточно качественен, хотя для крипто, конечно, не подойдет — его период равен == 0xffffffff.
А вообще, Д.Кнут приписал Джону фон Нейману следующие слова: "Каждый, кто применяет арифметические методы для создания случайных чисел, впадает в грех."
Здравствуйте, MaximE, Вы писали:
ME>Есть ли основания доверять CryptGenRandom и "/dev/random"? Известна ли их реализация?
Ну для /dev/random ( /dev/urandom ) известна ( исходники Linux,... )
В принципе там все четко. Рандомный пул замешивается MD5 при стартапе, через сколько то там чтений
еще MD5 и т.д.
Насчет CryptGenRandom — исходников, понятно, в свободном доступе нет, но там тоже, вроде, ничего себе.