почему rand возвращает одно и то же.
2. всё-таки наберусь наглости и спрошу
srand(1);
cout<<rand() % 100;
возвращает всё-время одно и то-же число. был пример с использованием time.h, там всё работало но не врублюсь никак что к чему. вот так
srand( (unsigned)time( NULL ) );
и еще. rand() % 100 обьясните плз механизм действия. " % " насколько я знаю означает остаток так вот к чему тут это..
СПАСИБО
зы то-ли дело в бэйсике (не помню что там в паскале) RANDOMIZE!!!!
[ Это Сообщение было отредактировано mike в 2002-02-28 0954 ]
srand(1);
cout<<rand() % 100;
возвращает всё-время одно и то-же число. был пример с использованием time.h, там всё работало но не врублюсь никак что к чему. вот так
srand( (unsigned)time( NULL ) );
и еще. rand() % 100 обьясните плз механизм действия. " % " насколько я знаю означает остаток так вот к чему тут это..
Правильно % остаток от деления, дык вот
rand() возвращает значения в диапазоне от 0 до RAND_MAX (который около 33000, а точнее половина от 65535)
А если нужно другой диапазон, скажеи от 10 до 99?
Вариант 1
int v = 10 + rand() * 90 / RAND_MAX;
тут всё понятно, но мы используем одно сложение, одно умножение и одно деление.
Вариант 2
int v = 10 + rand() % 100;
уже лучше, одно сложение и одно деление (у x86 процов одна операция div,idiv возвращает и остаток и результат)
А остаток от деления на N может быть от 0 до N-1 это очевидно
А насчет srand(1)
т.к. мы srand() звгружаем одним и тем же стартовым значением то и rand() вернёт одни и те же значения. Это равносильно что на бейсике написать RANDOMIZE 1. А ведь пишут всегда RANDOMIZE TIMER, что работает как srand(time(NULL)).
Подробнее почитай мой постинг в топике "Два вопроса ".
Вот такие дела
rand() возвращает значения в диапазоне от 0 до RAND_MAX (который около 33000, а точнее половина от 65535)
А если нужно другой диапазон, скажеи от 10 до 99?
Вариант 1
int v = 10 + rand() * 90 / RAND_MAX;
тут всё понятно, но мы используем одно сложение, одно умножение и одно деление.
Вариант 2
int v = 10 + rand() % 100;
уже лучше, одно сложение и одно деление (у x86 процов одна операция div,idiv возвращает и остаток и результат)
А остаток от деления на N может быть от 0 до N-1 это очевидно
А насчет srand(1)
т.к. мы srand() звгружаем одним и тем же стартовым значением то и rand() вернёт одни и те же значения. Это равносильно что на бейсике написать RANDOMIZE 1. А ведь пишут всегда RANDOMIZE TIMER, что работает как srand(time(NULL)).
Подробнее почитай мой постинг в топике "Два вопроса ".
Вот такие дела
[/quote]
так.. вроде ясно. непонятно только почему
int v = 10 + rand() % 100;
может
int v = 10 + rand() % 90; ?
не допру только что там с умножениями. щас напрягусь ) а понял, но логичнее было-бы написать 90*rand()/rand_max. но тут будем получать дробные числа
спасибо за помощь!
[ Это Сообщение было отредактировано TekiL в 2002-03-01 2244 ]
так.. вроде ясно. непонятно только почему
int v = 10 + rand() % 100;
может
int v = 10 + rand() % 90; ?
Да да именно, я как профессор, говорю одно думаю другое, пишу третье на самом деле четвёртое
не допру только что там с умножениями. щас напрягусь ) а понял, но логичнее было-бы написать 90*rand()/rand_max. но тут будем получать дробные числа
спасибо за помощь!
можно и с int, всё будет работать правильно, если умножение не переполнит разрядную сетку в 32 бита. Операции выполняются так, чтобы не потерять точность, если возможно, или слева на право, у нас всё будет ок, можно даже скобки поставить, все компиляторы 90*rand()/RAND_MAX поймут как
(90*rand())/RAND_MAX а не 90*(rand()/RAND_MAX)
srand(1) - это глупо!
посмотрите как работает генератор случ.
чисел...
On 2002-03-04 0725, Ramzes wrote
Вы чё!
srand(1) - это глупо!
посмотрите как работает генератор случ.
чисел...
А действительно КАК он работает? Где почитать? Какие операции на числом позволяют получить (псевдо?!)случайное число??
а про srand(1) ты не слушай - это я такой крутой программер. Москва не сразу строилась
А действительно КАК он работает? Где почитать? Какие операции на числом позволяют получить (псевдо?!)случайное число??
Ответ на этот и многие другие вопросы можно найти в книжке "Искусство программирования" автор Кнут. Три тома.
Там есть всё
Самый простой алгоритм генерации псевдослучайных чисел описывается вот этим рекуррентным соотношением
RAND(i+1) = (RAND(i)*c1 + c2) % m
При правильно подобранных c1, c2 возвращает все числа от нуля до m-1, псевдослучайным образом. Период сказывается только на последовательностях порядка m.
Попробуй c1 = 16807, c2 = 0, m=7FFFFFFF
#include <lvp\random.h>//random() and randomize()-functions
#include <iostream.h>
int main()
{
randomize();//randomizes random()-function return(random()-function will return a new value from run to run)
int Num = random(100)//returns random number from 0 to 99;
cout << Num << endl;
cout << endl;
return(0);
}
On 2002-04-06 0013, Anonymous wrote
Вы ребята чего только не изобретали, неужели никто про randomize() не слышал, не только в VisualBasic, функция есть и в C++ выше я привёл пример по её использованию.
Ага, только если у всех появиться библиотека LVP и файл lvp\random.h она будет.
Мы говорили о MSVCPP и никакого lvp тут не надо. В C/C++ аналог Basic'овского randomize - ф-ция srand(), а аналог rnd - ф-ция rand(), и точка!
On 2002-04-06 0013, Anonymous wrote
Вы ребята чего только не изобретали, неужели никто про randomize() не слышал, не только в VisualBasic, функция есть и в C++ выше я привёл пример по её использованию.
Ага, только если у всех появиться библиотека LVP и файл lvprandom.h она будет.
Мы говорили о MSVCPP и никакого lvp тут не надо. В C/C++ аналог Basic'овского randomize - ф-ция srand(), а аналог rnd - ф-ция rand(), и точка!
Если файл кому нужен, могу отправить.
[ Это Сообщение было отредактировано mike в 2002-04-07 0024 ]
Если файл кому нужен, могу отправить.
Нет, не нада спасимба.