Как сгенерировать случайное число от 0 до 4 ? (gcc 4.0.2 or KDevelop: C/C++) читал man random - но не очень понял - по этому у меня не совсем получается сделать... полскажите пожалуйста ?
Нет спасибо! я уже сделал как то так: srandom( time(NULL) ); random() % 4; --- и еще можно ли заставить генератор так что бы он генерил не повторяясь ? например надо сгенерить массив с 4х элементов (при этом все элементы различные!) или все таки написать "проверочку" (тоисть будет генерить в цикле при этом проверяя предыдущие елементы если совпадет то пошлю(continue) на следущий заход до тех пор пока число окажется другое) но это может оказаться возможно довольно долго... какие есть варианты? ;)
> и еще можно ли заставить генератор так что бы он генерил не повторяясь ? например надо сгенерить массив с 4х элементов (при этом все элементы различные!) или все таки написать "проверочку" (тоисть будет генерить в цикле при этом проверяя предыдущие елементы если совпадет то пошлю(continue) на следущий заход до тех пор пока число окажется другое) но это может оказаться возможно довольно долго... какие есть варианты? ;)
то что ты хочешь -- называется shuffle последовательности элементов (0,1,2,3).
Например, можно так сделать: каждый элемент помечается приоритетом random(), все элементы засовываются в std::priority_queue, и далее извлекаются оттуда все -- они будут в случайном порядке.
по поводу shuffle - примеры нашел, разобрался, спасибо! по поводу priority_queue и др. контейнеров - мне STL использовать нужно по минимуму :(( вообщем не актуально - как то разбирусь уже...
А насколько важна действительная случайность? Какая цель? Если просто, поиграться, то предложеные способы сойдут. Если-же для серъезных целей (симуляции Монте-Карло, например),
ОЧЕНЬ советую почитать седьмую главы "Численных рецептов" (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);
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.
> 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 и FLOAT) псевдослучайная последовательность инициализировалась посредством srand() одним и тем же числом, полученным от таймера при старте программы.