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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
gund
18 / 18 / 0
Регистрация: 05.05.2013
Сообщений: 88
#1

rand() cpp - C++

12.10.2013, 16:55. Просмотров 538. Ответов 6
Метки нет (Все метки)

1. Тут недавно мне пришлось вспомнить как работать с rand() в С++. Ну сложности не было, конечно, нужно было случайное число на неком промежутке [min-max]. Я сразу написал вот такую формулу:
max - rand()%(max-min)
А потом погуглил, думал может будет чето по меньше, и заметил, точнее совсем не заметил такой формулы, и подумал что она "неправильная", хоть я ее и потестил: выдавала она корректные числа.

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

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

Ошибка: [C++ Error] mk.cpp(20): E2268 Call to undefined function 'rand' - C++
#include <stdio.h> #include <math.h> #include <time.h> void main() { double x, y, s, p,V;

С помощью командной строки >namberstr f1.cpp Определить число строк в файле с именем f1.cpp - C++
С помощью командной строки >namberstr f1.cpp Определить число строк в файле с именем f1.cpp

Библиотеки в CPP. Ошибка компиляции | CPP - C++
Доброго вечера! Появился один вопросик недавно. Начал юзать библиотеку <windows.h> для использования такой команды как "system" в коде....

Подключение файлов main.cpp some.cpp some.h - C++
Всем привет, программа разделенна на три файла poly.cpp main.cpp poly.h Кто мог бы объяснить как происходит подключение этих файлов, и как...

C:\tsserver\Projects\cpp\codeblocks\MyComp\compiler\mmz\mmz. cpp|29|error: no match for 'operator=' in '* Item = * Source'| - C++
char **Source; TArray<std::string> *Item; ... *Item=*Source;

Использовать void из 1.cpp в 2.cpp - C++
Допустим, есть функция void Hello(). Она в файле 1.cpp. Мне нужно её использовать в файле 2.cpp, но программа пишет, что идентификатор не...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
kventin_zhuk
БНТУ ФИТР
215 / 155 / 15
Регистрация: 26.12.2012
Сообщений: 382
12.10.2013, 16:58 #2
gund, по логике вещей 0 можно и так

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

C++
1
srand(time(NULL) * time(NULL));
0
castaway
Эксперт С++
4884 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
12.10.2013, 17:00 #3
От min до max включительно.
C++
1
rand() % (max - min + 1) + min
Цитата Сообщение от gund Посмотреть сообщение
но я думаю может есть другой рабочий вариант, получше этого
Есть. Не писать srand(time(NULL)) в цикле.
1
gund
18 / 18 / 0
Регистрация: 05.05.2013
Сообщений: 88
12.10.2013, 18:36  [ТС] #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
Сброс по любому нужен в цикле.
0
castaway
Эксперт С++
4884 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
12.10.2013, 18:38 #5
Цитата Сообщение от gund Посмотреть сообщение
Если этого не делать получится что то типа
С какой стати? Приведи пример где так будет выдавать.
0
gund
18 / 18 / 0
Регистрация: 05.05.2013
Сообщений: 88
12.10.2013, 18:59  [ТС] #6
castaway, действительно, работает =)
Но почему так происходит, ведь тогда смысла в использовании srand() вообще нет =)
Но спасибо, теперь будет удобней)
0
Гром
210 / 129 / 11
Регистрация: 20.03.2009
Сообщений: 1,103
Записей в блоге: 16
Завершенные тесты: 1
12.10.2013, 20:26 #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, которые от запуска к запуску не меняются
2
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.10.2013, 20:26
Привет! Вот еще темы с ответами:

Разделение программы на .h .cpp .cpp - C++
Никак не пойму как правильно разделять программу на несколько файлов. Вот код : ( в чем проблема ? ) main.cpp #include...

Не могу исправить ошибку :113 H:\Dev-Cpp\Проекты\уроки\Безымянный3.cpp cannot convert `IDirectDraw7**' to `IDirectDraw**' for argument `2' to `HRESULT DirectDrawCreate(GUID*, IDirectDraw**, IUnknown*) - C++
Недавно начал изучать оконные программы и работу с DirectX. Но при написании программы столкнулся с проблемой: не могу исправить одну...

C:\tsserver\Projects\cpp\codeblocks\MyComp\IDE\IDE\IDE.cpp|1 5|error: 'InitApplication' was not declared in this scope| - C++
//================================================================================================= #include &quot;IDE.hpp&quot;...

C:\tsserver\Projects\cpp\codeblocks\MyComp\IDE\IDE\IDE.cpp|3 9|undefined reference to `GetStockObject@4'| - C++
C:\tsserver\Projects\cpp\codeblocks\MyComp\IDE\IDE\IDE.cpp|39|undefined reference to `GetStockObject@4'|


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
12.10.2013, 20:26
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru