LINUX.ORG.RU

Случайные числа [C++]

 


0

0

Как сгенерировать случайное число от 0 до 4 ? (gcc 4.0.2 or KDevelop: C/C++) читал man random - но не очень понял - по этому у меня не совсем получается сделать... полскажите пожалуйста ?


Ответ на: комментарий от dilmah

Нет спасибо! я уже сделал как то так: srandom( time(NULL) ); random() % 4; --- и еще можно ли заставить генератор так что бы он генерил не повторяясь ? например надо сгенерить массив с 4х элементов (при этом все элементы различные!) или все таки написать "проверочку" (тоисть будет генерить в цикле при этом проверяя предыдущие елементы если совпадет то пошлю(continue) на следущий заход до тех пор пока число окажется другое) но это может оказаться возможно довольно долго... какие есть варианты? ;)

STORM
() автор топика
Ответ на: комментарий от Reset

Предлагаете преобразовать MAX_RAND к типу double?

wfrr ★★☆
()
Ответ на: комментарий от STORM

> и еще можно ли заставить генератор так что бы он генерил не повторяясь ? например надо сгенерить массив с 4х элементов (при этом все элементы различные!) или все таки написать "проверочку" (тоисть будет генерить в цикле при этом проверяя предыдущие елементы если совпадет то пошлю(continue) на следущий заход до тех пор пока число окажется другое) но это может оказаться возможно довольно долго... какие есть варианты? ;)

то что ты хочешь -- называется shuffle последовательности элементов (0,1,2,3).

Например, можно так сделать: каждый элемент помечается приоритетом random(), все элементы засовываются в std::priority_queue, и далее извлекаются оттуда все -- они будут в случайном порядке.

dilmah ★★★★★
()
Ответ на: комментарий от dilmah

по поводу shuffle - примеры нашел, разобрался, спасибо! по поводу priority_queue и др. контейнеров - мне STL использовать нужно по минимуму :(( вообщем не актуально - как то разбирусь уже...

> кнут бы такое не одобрил...

не понял ?

STORM
() автор топика
Ответ на: комментарий от wfrr

А насколько важна действительная случайность? Какая цель? Если просто, поиграться, то предложеные способы сойдут. Если-же для серъезных целей (симуляции Монте-Карло, например),
ОЧЕНЬ советую почитать седьмую главы "Численных рецептов" (Numerical recipes) (http://www.fizyka.umk.pl/nrbook/bookcpdf.html)

то wfrr

>rand()/MAXRAND*4.0

(из той-же книжки):
If you want to generate a random integer between 1 and
10, you should always do it using high-order bits, as in
j=1+(int) (10.0*rand()/(RAND_MAX+1.0));
and never by anything resembling
j=1+(rand() % 10);

phrm ★★
()
Ответ на: комментарий от phrm

The versions of rand() and srand() in the Linux C Library use the same random number generator as random(3) and srandom(3), so the lower-order bits should be as random as the higher-order bits. However, on older rand() implementations, and on current implementations on different systems, the lower-order bits are much less random than the higher- order bits. Do not use this function in applications intended to be portable when good randomness is needed.

из мана по rand

anonymous
()
Ответ на: комментарий от STORM

>я уже сделал как то так: srandom( time(NULL) );

Ещё лучше так: srandom( time(NULL) + getuid())

php-coder ★★★★★
()
Ответ на: комментарий от phrm

> j=1+(int) (10.0*rand()/(RAND_MAX+1.0)); and never by anything resembling j=1+(rand() % 10);

Я пробовал недавно сравнить распределения, полученные обоими способами (на одинаковых последовательностях в 2 миллиона, сгенеренных rand(), сравнил на предмет отклонения от среднего и от дисперсии "идеально-равномерного" расределения "1 2 3 4 5 6 7 8 9 10") -- примерно одинаково, но вариант с j=1+(rand() % 10); как-то получше...

Linux 2.6.13-15-smp #1 SMP Tue Sep 13 14:56:15 UTC 2005 i686 i686 i386 GNU/Linux

GNU C Library stable release version 2.3.5 (20050802)

Вот, INTDV соответствует j=1+(rand() % 10); а FLOAT -- j=1+(int)(10.0*rand()/(RAND_MAX+1.0)); av -- отклонение среднего от матожидания, d -- отклонение дисперсии от теоретической. Четыре прогона:

INTDV :av=0.000064 d=0.000034

FLOAT:av=0.000187 d=0.000021

INTDV :av=0.000060 d=0.000191

FLOAT:av=0.000066 d=0.000098

INTDV :av=0.000004 d=0.000094

FLOAT:av=0.000072 d=0.000176

INTDV :av=0.000115 d=0.000041

FLOAT:av=0.000143 d=0.000065

Die-Hard ★★★★★
()
Ответ на: комментарий от Die-Hard

Вдогонку:

Для обоих случаев (INTDV и FLOAT) псевдослучайная последовательность инициализировалась посредством srand() одним и тем же числом, полученным от таймера при старте программы.

Die-Hard ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.