Генерация случайных чисел в C++

Danvu

Кто знает каким образом можно получить последовательность случайных чисел в C++?

dberezhnoy

Смотри int srand (int int rand;
Например так:
(double(rand/RAND_MAX)*n - случайное число от 0 до n-1

Danvu

Спасибо, но таким образом она генерит при каждом запуске одинаковую последовательность.

dberezhnoy

Для этого используй инициализацию с помощью srand
Напрмер так
#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;
}

Danvu

Огромное Спасибо.
Всё заработало.

ppplva

Почему ты считаешь, что rand%100 хуже ? Гораздо быстрее.
Распределение неправильное при RAND_MAX % 100 != 0 ? ИМХО, мелочи, хотя если вместо 100 взять 100000000...

dberezhnoy

не за что, хе-хе

dberezhnoy

это не я считаю, а Страуструп: "...младшие биты в случайном числе часто вызывают подозрение, поэтому rand%n - нельзя назвать хорошим переносимым способом генерирования случайных чисел..."

VitMix

Вызывают подозрение -- это мягко сказано. Самый младший бит вообще чередуется. Я обычно использую (rand / 23) % Max чтобы получить случайное число от 0 до Max - 1. Вместо 23 каждый может поставить свое любимое простое число. А вообще-то в новом стандарте C (и скорее всего в C++ тоже) есть функция random, которая лишена многих недостатков rand.
Для справки. В C функция rand работает по формуле
new = (old * 1103515245 + 12345) % u_long)RAND_MAX + 1)
Отсюда можно сделать вывод о том, насколько "случайны" числа, возвращаемые этой функцией. (Формула взята из исходных текстов FreeBSD-4.8-RC)

bobking


http://people.freebsd.org/~obrien/ansi-c99-standard.pdf.bz2 (это если денег нету)
http://www.opengroup.org/austin/
Да, а зачем ты стандарт C++ приплёл?

kanareykina

>(это если денег нету)
не рюхнул
там что ли написано, где деньги дают?

VitMix

> Да, а зачем ты стандарт C++ приплёл?
Вопрос звучал "Кто знает каким образом можно получить последовательность случайных чисел в C++? "

otvertka07

чисто программными средствами - никак

Chupa

читай из /dev/random, если есть такая возможность

CapitanJack

а как на счет криптографически случайных ?

bobking

Он о них и говорит.
i815, i845, amd760.

CapitanJack

програмным способом можно

bobking

Ы как?

CapitanJack

надо мне тетрадку с лекциями свою взять и посмотреть

bobking

Загрузил ты меня.
Мы вообще об одном говорим?

CapitanJack

угу - генераторы псевдослучайных криптографически стойких чисел

onairika

Ты сам бы прочитал, что написал
"ПСЕВДОслучайных"

Xolvil

ИМХО, случайные невозможны !

Filan

Правильно он всё написал.

onairika

А я и не говорю что неправильно, только между псевдослучайными и случайными есть разница

Filan

> между псевдослучайными и случайными есть разница
Ну и как это относится к теме?
Если случайные числа нельзя программно сгенерить, то псевдослучайные можно.
Или ты придираешься к тому, что первый раз он упустил приставку "ПСЕВДО"?

onairika

угу

bobking

> угу - генераторы псевдослучайных криптографически стойких чисел
Ааааа!
Тогда, конечно, можно.

VitMix

Генерировать действительно случайные числа все-таки возможно. Просто для этого надо использовать некий внешний источник случайности. Например часто используют таймер. Но таймер слишком предсказуем. Во FreeBSD есть такая фишка, как /dev/urandom. в качестве источника случайности он использует последовательность обращений к устройствам, памяти и ядру. Если система работает долго, то этого достаточно. А вообще в некоторых chipsetах (напр. i810) есть аппаратный генератор СЧ.

bobking

Да рюх ты, рюх. Я это сразу понял. Отстань только, будь столь любезен.

onairika

А как этот аппаратный генератор работает мож знаешь?

bobking

http://www.intel.com/design/chipsets/manuals/298029.pdf
Ну вот хули оригинальную документацию игнорировать? Почему всё в разжёванном виде надо, да ещё редкими зубками?

kanareykina

маза там описание интерфейса
а про принцип действия одна невнятная строчка

bobking

Ещё про теорию этого дела до хрена было на R&D сайте IBM. Искать по словам crypto, accelerator.

onairika

ты не нервничей так

truman1

Случайные числа программно получить нельзя. Только псевдослучайные, обычно при этом используется линейный конгруэнтный датчик случайных чисел. Для криптографии используются датчики, непредикативные влево. Все псевдослучайные не являются таковыми, если не задать им на вход случайное число (последовательность).
Еще можно использовать 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.
Оставить комментарий
Имя или ник:
Комментарий: