Генерация случайных чисел в C++
Например так:
(double(rand/RAND_MAX)*n - случайное число от 0 до n-1
Спасибо, но таким образом она генерит при каждом запуске одинаковую последовательность.
Напрмер так
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
int main(void)
{
int i;
time_t t;
srandunsigned) time(&t;
printf("Ten random numbers from 0 to 99\n\n");
for(i=0; i<10; i++)
printf("%d\n", intdouble(rand/RAND_MAX) * 100;
/*
можно по другому написать редыдущую строку, но то как написано сейчас более лучший способ, но если тебе все равно то: printf("%d\n", rand % 100);
*/
return 0;
}
Всё заработало.
Распределение неправильное при RAND_MAX % 100 != 0 ? ИМХО, мелочи, хотя если вместо 100 взять 100000000...
не за что, хе-хе
это не я считаю, а Страуструп: "...младшие биты в случайном числе часто вызывают подозрение, поэтому rand%n - нельзя назвать хорошим переносимым способом генерирования случайных чисел..."
Для справки. В C функция rand работает по формуле
new = (old * 1103515245 + 12345) % u_long)RAND_MAX + 1)
Отсюда можно сделать вывод о том, насколько "случайны" числа, возвращаемые этой функцией. (Формула взята из исходных текстов FreeBSD-4.8-RC)
http://people.freebsd.org/~obrien/ansi-c99-standard.pdf.bz2 (это если денег нету)
http://www.opengroup.org/austin/
Да, а зачем ты стандарт C++ приплёл?
не рюхнул
там что ли написано, где деньги дают?
Вопрос звучал "Кто знает каким образом можно получить последовательность случайных чисел в C++? "
чисто программными средствами - никак
читай из /dev/random, если есть такая возможность
а как на счет криптографически случайных ?
i815, i845, amd760.
програмным способом можно
Ы как?
надо мне тетрадку с лекциями свою взять и посмотреть
Мы вообще об одном говорим?
угу - генераторы псевдослучайных криптографически стойких чисел
"ПСЕВДОслучайных"
ИМХО, случайные невозможны !
Правильно он всё написал.
А я и не говорю что неправильно, только между псевдослучайными и случайными есть разница
Ну и как это относится к теме?
Если случайные числа нельзя программно сгенерить, то псевдослучайные можно.
Или ты придираешься к тому, что первый раз он упустил приставку "ПСЕВДО"?
угу
Ааааа!
Тогда, конечно, можно.
Генерировать действительно случайные числа все-таки возможно. Просто для этого надо использовать некий внешний источник случайности. Например часто используют таймер. Но таймер слишком предсказуем. Во FreeBSD есть такая фишка, как /dev/urandom. в качестве источника случайности он использует последовательность обращений к устройствам, памяти и ядру. Если система работает долго, то этого достаточно. А вообще в некоторых chipsetах (напр. i810) есть аппаратный генератор СЧ.
Да рюх ты, рюх. Я это сразу понял. Отстань только, будь столь любезен.
А как этот аппаратный генератор работает мож знаешь?
http://www.intel.com/design/chipsets/manuals/298029.pdf
Ну вот хули оригинальную документацию игнорировать? Почему всё в разжёванном виде надо, да ещё редкими зубками?
Ну вот хули оригинальную документацию игнорировать? Почему всё в разжёванном виде надо, да ещё редкими зубками?
а про принцип действия одна невнятная строчка
Ещё про теорию этого дела до хрена было на R&D сайте IBM. Искать по словам crypto, accelerator.
ты не нервничей так
Еще можно использовать Intel True Random Generator, он встроен во все новые процы Интела, см. developer.intel.com/design/chipsets/rng/docs.htm
Обычно хардварные ГСЧ используются только для "посева", а потом используются ПГСЧ. т.к. они быстрее, дешевле и также некоторые криптографические алгоритмы требуют ПГСЧ.
См. также насчет ПГСЧ:
Knuth, D.E. The Art of Computer Programming: Seminumerical Algorithms, Vol. 2, ch. 3, Addison Wesley Longman, 1998.
http://sunburn.stanford.edu/~knuth/
Для проверки случайности сгенеренной последовательности используй DIEHARD.
Оставить комментарий
Danvu
Кто знает каким образом можно получить последовательность случайных чисел в C++?