Генерация случайных чисел в C++
Смотри int srand (int int rand;
Например так:
(double(rand/RAND_MAX)*n - случайное число от 0 до n-1
Например так:
(double(rand/RAND_MAX)*n - случайное число от 0 до n-1
Спасибо, но таким образом она генерит при каждом запуске одинаковую последовательность. 

Для этого используй инициализацию с помощью 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;
}
Напрмер так
#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%100 хуже ? Гораздо быстрее.
Распределение неправильное при RAND_MAX % 100 != 0 ? ИМХО, мелочи, хотя если вместо 100 взять 100000000...
Распределение неправильное при RAND_MAX % 100 != 0 ? ИМХО, мелочи, хотя если вместо 100 взять 100000000...
не за что, хе-хе 

это не я считаю, а Страуструп: "...младшие биты в случайном числе часто вызывают подозрение, поэтому rand%n - нельзя назвать хорошим переносимым способом генерирования случайных чисел..."
Вызывают подозрение -- это мягко сказано. Самый младший бит вообще чередуется. Я обычно использую (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)
Для справки. В 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++ приплёл?
Вопрос звучал "Кто знает каким образом можно получить последовательность случайных чисел в C++? "
Вопрос звучал "Кто знает каким образом можно получить последовательность случайных чисел в C++? "
чисто программными средствами - никак
читай из /dev/random, если есть такая возможность
а как на счет криптографически случайных ? 

Он о них и говорит.
i815, i845, amd760.
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.
Еще можно использовать 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++?