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

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

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

rand() cpp - C++

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

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++ 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;

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

Main.cpp In file included from main.cpp - C++
//class.cpp #include "class.h" Ticket::Ticket() { prise = 0; marshrut = "none"; time = "none"; ...

rand()%(-20)%(20); - C++
Нужно сорт случ числа от -20 до 20 Делаю так rand()%(-20)%(20); получаю числа от 0 до 20, а мне нужно от -20 ;

Rand() - C++
metka: r1=rand()%2; r2=rand()%2; if(r1==a && r2==b)goto metka; else arr=='O'; Собсно-это кусок кода...

rand - C++
всем привет) что означает вот это строка double value = (rand()%1000)/100.0 - 5.0; и чем она отличается от этой double value =...

Rand() - C++
Ребята срочно nомогите , как сгенерировать с nомощью функции rand() рандомные числа 0 или 1 ?

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
kventin_zhuk
БНТУ ФИТР
215 / 155 / 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
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 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
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 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
Еще ссылки по теме:

rand - C++
#include "stdafx.h" #include <iostream> #include <conio.h> #include <cstdlib> // гениратор случайных чисел using namespace std; ...

не работает rand() - C++
#include <vector> #include <iostream> #include <numeric> #include <cstdlib> using namespace std; int main(int argc, char...

Глючит rand - C++
В visual studio 2008 при компилировании с настройками release (F5/Ctrl+F5) все нормально, но если потом запустить полученный файл, то rand...

rand в диапазоне... - C++
не удаётся rand в диапазоне, так чтобы значения при каждой прогонке значения менялись. к примеру - число из диапазона. мой первый...

Функция - rand - C++
Здравствуйте. Проблема - нужно сгенерировать случайное число из области чисел введённых в переменную. Допустим, я создаю переменную: ...


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

Или воспользуйтесь поиском по форуму:
Гром
210 / 129 / 11
Регистрация: 20.03.2009
Сообщений: 1,103
Записей в блоге: 16
Завершенные тесты: 1
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
Ответ Создать тему
Опции темы

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