Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

почему rand возвращает одно и то же.

629
28 февраля 2002 года
TekiL
19 / / 20.09.2000
1. нету-ли в инете (не обязательно русском) форум для новичков? здесь сидять крутые профи, неловко как-то элеметарные вещи спрашивать.
2. всё-таки наберусь наглости и спрошу

srand(1);
cout<<rand() % 100;

возвращает всё-время одно и то-же число. был пример с использованием time.h, там всё работало но не врублюсь никак что к чему. вот так
srand( (unsigned)time( NULL ) );

и еще. rand() % 100 обьясните плз механизм действия. &quot; % &quot; насколько я знаю означает остаток так вот к чему тут это..

СПАСИБО

зы то-ли дело в бэйсике (не помню что там в паскале) RANDOMIZE!!!!



[ Это Сообщение было отредактировано mike в 2002-02-28 0954 ]
4
28 февраля 2002 года
mike
3.7K / / 01.10.2002
http://www.codenet.ru/progr/cpp/spru/srand.php
http://www.codenet.ru/progr/cpp/spru/rand.php

тут на русском.
380
01 марта 2002 года
Arestov
285 / / 20.09.2000
Цитата:

srand(1);
cout<<rand() % 100;

возвращает всё-время одно и то-же число. был пример с использованием time.h, там всё работало но не врублюсь никак что к чему. вот так
srand( (unsigned)time( NULL ) );

и еще. rand() % 100 обьясните плз механизм действия. &quot; % &quot; насколько я знаю означает остаток так вот к чему тут это..



Правильно % остаток от деления, дык вот
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)).
Подробнее почитай мой постинг в топике &quot;Два вопроса &quot;.


Вот такие дела

629
02 марта 2002 года
TekiL
19 / / 20.09.2000
Правильно % остаток от деления, дык вот
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)).
Подробнее почитай мой постинг в топике &quot;Два вопроса &quot;.


Вот такие дела

[/quote]

так.. вроде ясно. непонятно только почему
int v = 10 + rand() % 100;
может
int v = 10 + rand() % 90; ?

не допру только что там с умножениями. щас напрягусь ) а понял, но логичнее было-бы написать 90*rand()/rand_max. но тут будем получать дробные числа
спасибо за помощь!


[ Это Сообщение было отредактировано TekiL в 2002-03-01 2244 ]
380
02 марта 2002 года
Arestov
285 / / 20.09.2000
Цитата:

так.. вроде ясно. непонятно только почему
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)

409
04 марта 2002 года
Ramzes
163 / / 20.09.2000
Вы чё!
srand(1) - это глупо!
посмотрите как работает генератор случ.
чисел...
629
04 марта 2002 года
TekiL
19 / / 20.09.2000
Цитата:

On 2002-03-04 0725, Ramzes wrote
Вы чё!
srand(1) - это глупо!
посмотрите как работает генератор случ.
чисел...


А действительно КАК он работает? Где почитать? Какие операции на числом позволяют получить (псевдо?!)случайное число??
а про srand(1) ты не слушай - это я такой крутой программер. Москва не сразу строилась

380
04 марта 2002 года
Arestov
285 / / 20.09.2000
Цитата:

А действительно КАК он работает? Где почитать? Какие операции на числом позволяют получить (псевдо?!)случайное число??



Ответ на этот и многие другие вопросы можно найти в книжке &quot;Искусство программирования&quot; автор Кнут. Три тома.
Там есть всё

Самый простой алгоритм генерации псевдослучайных чисел описывается вот этим рекуррентным соотношением

RAND(i+1) = (RAND(i)*c1 + c2) % m

При правильно подобранных c1, c2 возвращает все числа от нуля до m-1, псевдослучайным образом. Период сказывается только на последовательностях порядка m.
Попробуй c1 = 16807, c2 = 0, m=7FFFFFFF

Аноним
/*Example*/
#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);
}


Аноним
Вы ребята чего только не изобретали, неужели никто про randomize() не слышал, не только в VisualBasic, функция есть и в C++ выше я привёл пример по её использованию.
380
06 апреля 2002 года
Arestov
285 / / 20.09.2000
Цитата:

On 2002-04-06 0013, Anonymous wrote
Вы ребята чего только не изобретали, неужели никто про randomize() не слышал, не только в VisualBasic, функция есть и в C++ выше я привёл пример по её использованию.



Ага, только если у всех появиться библиотека LVP и файл lvp\random.h она будет.
Мы говорили о MSVCPP и никакого lvp тут не надо. В C/C++ аналог Basic'овского randomize - ф-ция srand(), а аналог rnd - ф-ция rand(), и точка!

409
06 апреля 2002 года
Ramzes
163 / / 20.09.2000
Просто надо вызвать srand(unsigned int seed) с правильным параметром seed, например 19324865 или что-то в этом роде. Это число учавствует в умножении. Поэтому если поставить 1 то будет получаться одно и тоже.
Аноним
Цитата:

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 ]

380
07 апреля 2002 года
Arestov
285 / / 20.09.2000
Цитата:

Если файл кому нужен, могу отправить.



Нет, не нада спасимба.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог