Форум программистов, компьютерный форум CyberForum.ru

rand() cpp - C++

Восстановить пароль Регистрация
 
gund
18 / 18 / 0
Регистрация: 05.05.2013
Сообщений: 88
12.10.2013, 16:55     rand() cpp #1
1. Тут недавно мне пришлось вспомнить как работать с rand() в С++. Ну сложности не было, конечно, нужно было случайное число на неком промежутке [min-max]. Я сразу написал вот такую формулу:
max - rand()%(max-min)
А потом погуглил, думал может будет чето по меньше, и заметил, точнее совсем не заметил такой формулы, и подумал что она "неправильная", хоть я ее и потестил: выдавала она корректные числа.

Вы думаете, можно такую формулу юзать, или она дольше работает или неправильно (что врядли, но возможно(= ).

2. И еще момент. Мне нужно было получать этот рандом в цикле, соответственно простой
C++
1
srand(time(NULL))
не катит (т.к итерации бешено быстрые) и я решил проблему вот так:
C++
1
srand(time(NULL)*i)
Работает на ура, но я думаю может есть другой рабочий вариант, получше этого, или так можно спокойно делать? =)
Спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.10.2013, 16:55     rand() cpp
Посмотрите здесь:

C++ Не могу исправить ошибку :113 H:\Dev-Cpp\Проекты\уроки\Безымянный3.cpp cannot convert `IDirectDraw7**' to `IDirectDraw**' for argument `2' to `HRESULT DirectDrawCreate(GUID*, IDirectDraw**, IUnknown*)
C:\tsserver\Projects\cpp\codeblocks\MyComp\compiler\mmz\mmz. cpp|29|error: no match for 'operator=' in '* Item = * Source'| C++
C:\tsserver\Projects\cpp\codeblocks\MyComp\IDE\IDE\IDE.cpp|1 5|error: 'InitApplication' was not declared in this scope| C++
C++ C:\tsserver\Projects\cpp\codeblocks\MyComp\IDE\IDE\IDE.cpp|3 9|undefined reference to `GetStockObject@4'|
C++ Ошибка: [C++ Error] mk.cpp(20): E2268 Call to undefined function 'rand'
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
kventin_zhuk
БНТУ ФИТР
 Аватар для kventin_zhuk
214 / 154 / 15
Регистрация: 26.12.2012
Сообщений: 382
12.10.2013, 16:58     rand() cpp #2
gund, по логике вещей 0 можно и так

C++
1
srand(i);
или какое

C++
1
srand(time(NULL) * time(NULL));
castaway
Эксперт С++
4837 / 2976 / 367
Регистрация: 10.11.2010
Сообщений: 11,008
Записей в блоге: 10
Завершенные тесты: 1
12.10.2013, 17:00     rand() cpp #3
От min до max включительно.
C++
1
rand() % (max - min + 1) + min
Цитата Сообщение от gund Посмотреть сообщение
но я думаю может есть другой рабочий вариант, получше этого
Есть. Не писать srand(time(NULL)) в цикле.
gund
18 / 18 / 0
Регистрация: 05.05.2013
Сообщений: 88
12.10.2013, 18:36  [ТС]     rand() cpp #4
kventin_zhuk, srand(i) можно, но тогда получаются одни и те же числа при каждом запуске программы (ведь i всегда от n до m), а srand(time(NULL) * time(NULL)) лишено смысла так как в один момент они одинаковы соответственно это тоже что и srand(time(NULL)) - то есть не подходит.

castaway, эту формулу я видел, но она длинней чем моя. =)
Цитата Сообщение от castaway Посмотреть сообщение
Не писать srand(time(NULL)) в цикле.
Если этого не делать получится что то типа
243
243
243
243
243
Сброс по любому нужен в цикле.
castaway
Эксперт С++
4837 / 2976 / 367
Регистрация: 10.11.2010
Сообщений: 11,008
Записей в блоге: 10
Завершенные тесты: 1
12.10.2013, 18:38     rand() cpp #5
Цитата Сообщение от gund Посмотреть сообщение
Если этого не делать получится что то типа
С какой стати? Приведи пример где так будет выдавать.
gund
18 / 18 / 0
Регистрация: 05.05.2013
Сообщений: 88
12.10.2013, 18:59  [ТС]     rand() cpp #6
castaway, действительно, работает =)
Но почему так происходит, ведь тогда смысла в использовании srand() вообще нет =)
Но спасибо, теперь будет удобней)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.10.2013, 20:26     rand() cpp
Еще ссылки по теме:

С помощью командной строки >namberstr f1.cpp Определить число строк в файле с именем f1.cpp C++
Использовать void из 1.cpp в 2.cpp C++
Main.cpp In file included from main.cpp C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Гром
 Аватар для Гром
199 / 118 / 10
Регистрация: 20.03.2009
Сообщений: 1,075
Записей в блоге: 15
12.10.2013, 20:26     rand() cpp #7
Смысл использования srand в том, что если его не использовать вообще, то каждый раз будут одни и те же последовательности псевдослучайных чисел. Если вызвать его один раз перед генерацией в виде srand(time(0)), то начальное значение последовательности всегда будет разным (т.к. время не будет одинаковым в двух разных вызовах программы) и сами последовательности, соответственно, тоже.

Если вызывать его каждый раз в цикле, то в тех итерациях, когда время будет "одинаковым" (система еще не обновила текущее время), вас будет каждый раз отбрасывать к первому генерируемому значению в последовательности, а поскольку результат srand(time(0)) в этих итерациях будет одинаков, и последовательности одинаковые, то вы будете получать одинаковые результаты.

К примеру, предположим, что srand устанавливает "затравочное" число на свой аргумент, а rand работает очень просто:
C++
1
2
3
4
5
6
7
8
9
10
void srand(uint x)
{
initValue = x;
}
uint rand()
{
uint res = initValue * 2 + 3;
initValue += 42;
return res;
}
Тогда получим:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
for (uint i = 0; i < 10; ++i)
 //допустим, за все 10 итераций системное время не успело обновиться и равно 100
 {
 srand(time(0));   //initValue = 100;
 uint x = rand();   //initValue = 142, x = 203
 }   //в следующей итерации будут те же самые результаты
 
 
srand(time(0));   //допустим, время стало 150
for (uint i = 0; i < 3; ++i)
 x = rand();  //1. x = 303, initValue = 192;  2. x = 387, initValue = 234;  3. x = 471, initValue = 276
 
 
for (uint i = 0; i < 3; ++i)
 {
 srand(i);   //1. initValue = 0;   2. initValue = 1;    3. initValue = 2
 x = rand();   //1. x = 3, initValue = 42;   2. x = 5, initValue = 43;   3. x = 7, initValue = 44
 }
//все хорошо, но при каждом запуске программы последовательность будет одна и та же -
//она будет зависеть исключительно от значений i, которые от запуска к запуску не меняются
Yandex
Объявления
12.10.2013, 20:26     rand() cpp
Ответ Создать тему
Опции темы

Текущее время: 01:37. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru