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

Как генерировать случайные числа? - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 98, средняя оценка - 4.63
knf
16 / 16 / 2
Регистрация: 18.09.2012
Сообщений: 184
02.03.2013, 20:56     Как генерировать случайные числа? #1
Как в с++ с генерировать, например положительные числа от 0 до 10? знаю, что есть генератор rand в библиотеке stdlib.h, но не знаю, как он работает и как вообще им пользоваться.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.03.2013, 20:56     Как генерировать случайные числа?
Посмотрите здесь:

Случайные числа C++
как в массив записать случайные числа но чтобы не повторялись C++
случайные числа C++
C++ Случайные числа
Как реализовать случайные числа? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ev[G]eN
Эксперт С++
 Аватар для Ev[G]eN
5093 / 1531 / 381
Регистрация: 23.01.2011
Сообщений: 3,148
02.03.2013, 21:07     Как генерировать случайные числа? #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <cstdlib>
#include <ctime>
 
int main ()
{
    srand(time(0));
 
    for (int i = 0; i < 10; i++)
        std::cout << (rand() % 11) << " ";
 
    return 0;
}
BumerangSP
 Аватар для BumerangSP
4283 / 1405 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
02.03.2013, 21:10     Как генерировать случайные числа? #3
C++
1
2
3
4
5
6
7
#include <ctime>
#include <cstdlib>
int main()
{
   srand(time(NULL));
   int a = rand()%11;
}
Добавлено через 14 секунд

Не по теме:

эх =(

knf
16 / 16 / 2
Регистрация: 18.09.2012
Сообщений: 184
02.03.2013, 21:26  [ТС]     Как генерировать случайные числа? #4
А теперь можно ли объяснить?)
Pepsy
47 / 32 / 4
Регистрация: 05.01.2013
Сообщений: 307
02.03.2013, 21:30     Как генерировать случайные числа? #5
Элемент случайности
может быть введен в компьютерные приложения с помощью функции rand
из стандартной библиотеки С.
Рассмотрим следующий оператор:
i = rand() ;
Функция rand генерирует целое число в диапазоне между 0 и
RAND_MAX (символическая константа, определенная в заголовочном файле
<stdlib.h>). Значение RAND_MAX должно быть по меньшей мере равно
32767 — максимальное положительное значение двухбайтового (т.е. 16-би-
тового) целого числа. Программы, представленные в этом разделе, были про-
верены на системе с максимальным значением RAND_MAX, равным 32767.
Если rand действительно вырабатывает случайные целые число, то при каж-
дом вызове rand результирующее число имеет равную вероятность оказаться
любым целым, лежащим между 0 и RAND_MAX.
Диапазон значений, которые вырабатываются непосредственно функцией
rand, отличается от диапазонов, которые требуются в специальных прило-
жениях. Например, программа, моделирующая бросание монеты, требует
только двух значений: 0 для «орла» и 1 для «решки». Программе, модели-
рующей метание кости с шестью гранями, должны бы потребоваться слу-
чайные целые числа в диапазоне от 1 до 6. Программа, которая случайным
образом определяет тип следующего космического корабля (из четырех воз-
можных), пересекающего горизонт в видеоигре, должна требовать случайные
целые числа в диапазопе от 1 до 4.
Чтобы продемонстрировать rand, давайте разработаем программу моде-
лирования 20 бросаний шестигранной игральной кости с печатью результата
каждого бросания. Прототип функции rand можно найти в <stdlib.h>. Для
того, чтобы выработать целые числа в диапазоне от 0 до 5, используем опе-
рацию вычисления остатка % в сочетании с rand:
rand() % 6
Это называется масштабированием. Число 6 называется масштабирую-
щим коэффициентом. Затем мы сдвигаем диапазон чисел, добавляя 1 к по-
лученному результату. Результаты находятся в
диапазоне от 1 до 6.

Не по теме:

Взято с Дейтела))

NeonLost
Пес войны
 Аватар для NeonLost
74 / 85 / 3
Регистрация: 23.02.2012
Сообщений: 653
02.03.2013, 22:58     Как генерировать случайные числа? #6
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// uniform_int_distribution
#include <iostream>
#include <random>
 
int main()
{
  const int nrolls = 10000; // number of experiments
  const int nstars = 95;    // maximum number of stars to distribute
 
  std::default_random_engine generator;
  std::uniform_int_distribution<int> distribution(0,9);
 
  int p[10]={};
 
  for (int i=0; i<nrolls; ++i) {
    int number = distribution(generator);
    ++p[number];
  }
 
  std::cout << "uniform_int_distribution (0,9):" << std::endl;
  for (int i=0; i<10; ++i)
    std::cout << i << ": " << std::string(p[i]*nstars/nrolls,'*') << std::endl;
 
  return 0;
}
knf
16 / 16 / 2
Регистрация: 18.09.2012
Сообщений: 184
02.03.2013, 23:09  [ТС]     Как генерировать случайные числа? #7
NeonLost, Темой не ошибся?)
NeonLost
Пес войны
 Аватар для NeonLost
74 / 85 / 3
Регистрация: 23.02.2012
Сообщений: 653
02.03.2013, 23:28     Как генерировать случайные числа? #8
Цитата Сообщение от knf Посмотреть сообщение
NeonLost, Темой не ошибся?)
ну ты спрашивал про С++, а rand это вроде сишная функция...)
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
07.03.2013, 15:08     Как генерировать случайные числа? #9
C++
1
2
3
4
5
6
7
int random(int lower_bound, int upper_bound)
{
    return lower_bound + (upper_bound - lower_bound) * static_cast<int>(static_cast<double>(rand()) / RAND_MAX);
}
...
 
int random_value_from_0_till_10 = random(0, 10);
System16v
 Аватар для System16v
3 / 3 / 0
Регистрация: 19.02.2014
Сообщений: 115
23.03.2015, 14:04     Как генерировать случайные числа? #10
Подскажите пожалуйста.Почему функция rand неправильно генерирует числа? Задание было - Напишите операторы, которые присваивают случайные целые значения
переменной п в следующих диапазонах:
a) 1 < n < 2, b) 1 < n < 100, c) 0 < n < 9, d) 1000 < n < 1112, e) -1 < n < 1, f) -3< n < 11

Написал код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
//---------------------------------------------------------------------------
#include <vcl.h>
#include <iostream>
#include <cstdlib>
#include <math>
#include <iomanip>
 
using namespace std;
 
double chisloA(double);
double chisloB(double);
double chisloC(double);
double chisloD(double);
double chisloF(double);
double chisloE(double);
 
int main()
{
        srand(time(0));
        double n;
        cout << "Chislo 1) " << chisloA(n) << endl;
        cout << "Chislo 2) " << chisloB(n) << endl;
        cout << "Chislo 3) " << chisloC(n) << endl;
        cout << "Chislo 4) " << chisloD(n) << endl;
        cout << "Chislo 5) " << chisloF(n) << endl;
        cout << "Chislo 6) " << chisloE(n) << endl;
        system("pause");
        return 0;
}
double chisloA(double n)
{
      return n=1+rand()%2;
}
double chisloB(double n)
{
      return n=1+rand()%100;
}
double chisloC(double n)
{
      return n=0+rand()%9;
}
double chisloD(double n)
{
      return n=1000+rand()%1112;
}
double chisloF(double n)
{
      return n=-1+rand()%1;
}
double chisloE(double n)
{
      return n=-3+rand()%11;
}
Так вот a,b,c,f,e выбирает в правильном диапазоне,а D должна выбирать от 1000 до 1112,а она выдает числа 1900\1743 и т.д.,т.е. за диапазоном,что не так то?

Добавлено через 6 минут
Верней правильней вот так конечно
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
//---------------------------------------------------------------------------
#include <vcl.h>
#include <iostream>
#include <cstdlib>
#include <math>
#include <iomanip>
 
using namespace std;
 
int chisloA();
int chisloB();
int chisloC();
int chisloD();
int chisloF();
int chisloE();
 
int main()
{
        srand(time(0));
        cout << "Chislo 1) " << chisloA() << endl;
        cout << "Chislo 2) " << chisloB() << endl;
        cout << "Chislo 3) " << chisloC() << endl;
        cout << "Chislo 4) " << chisloD() << endl;
        cout << "Chislo 5) " << chisloF() << endl;
        cout << "Chislo 6) " << chisloE() << endl;
        system("pause");
        return 0;
}
int chisloA()
{
      return 1+rand()%2;
}
int chisloB()
{
      return 1+rand()%100;
}
int chisloC()
{
      return 0+rand()%9;
}
int chisloD()
{
      return 1000+rand()%1112;
}
int chisloF()
{
      return -1+rand()%1;
}
int chisloE()
{
      return -3+rand()%11;
}
Но результат тот же,везде правильно,а D неправильно за диапазоном.Во прикол...
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
23.03.2015, 14:18     Как генерировать случайные числа? #11
System16v, смотрите: выражение rand() % 1112 вернёт значение от 0 до 1111. А вы к этому значению ещё 1000 прибавляете. Понятно, что если rand() % 1112 вернул значение больше 112, то результат выражения выйдет за диапазон. Поэтому ван нужно брать по модулю не 1112, а по модулю 1112-1000 (т.е. верхняя граница минус нижняя граница).
Ну и кроме того, по условию задачи все интервалы открытые (неравенства нестрогие), а у вас все интервалы полуоткрытые (верхняя граница не попадёт в диапазон, а вот нижняя очень даже может попасть).
Ещё у меня вызывает вопрос самое первое задание. Если речь только о целых числах, то оно невыполнимо. Не существует целого числа, которое было бы строго больше 1 и в то же время строго меньше 2. Если речь о действительных числах, то алгоритм генерации значений нужен другой.
System16v
 Аватар для System16v
3 / 3 / 0
Регистрация: 19.02.2014
Сообщений: 115
23.03.2015, 14:37     Как генерировать случайные числа? #12
silent_1991, вроде врубился,спасибо. Тогда немного не понимаю,почему другие диапазоны выбирают правильные значения?И чет запутался по интервалам....,по книге неравенства нестрогие,т.е. в диапазоны сами числа должны входить,они вроде бы входят,ну если бы были строгие неравенства,то просто надо получается сдвинуть диапазон на единицу?

Добавлено через 11 минут
Нашел ответы из книги там приведен код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int main()
{
 
    srand( time( 0 ));
 
    cout << "Random number for 1 <= n <= 2 is " << rand() % 2 + 1 << endl;
    cout << "Random number for 1 <= n <= 100 is " << rand() % 100 + 1 << endl;
    cout << "Random number for 0 <= n <= 9 is " << rand() % 10 << endl;
    cout << "Random number for 1000 <= n <= 1112 is " << rand() % 113 + 1000 << endl;
    cout << "Random number for -1 <= n <= 1 is " << rand() % 3 - 1 << endl;
    cout << "Random number for -3 <= n <= 11 is " << rand() % 15 - 3 << endl;
 
    return 0;
}
Если смотреть по 1му и 2му числу,то понятно, какой диапазон указан в условии,теже числа и пишем в ранд,далее идет от 0 до 9,почему указан диапазон 10?Потом диапазон 1000-113,почему 113,а не 112? Далее от -1 до 1го,вообще использовали диапазон от -1 до 3,а в последнем так 15...Почему 15,ведь взять туже генерированное число 15,то получаем 15-3=12,а 12 уже за диапазоном т.к. нужно до 11ти.Верней как бы принцип подсчета я понимаю,просто не пойму как быстро сообразить и написать верный диапазон.Или нужно досканально считать по неравенству?Но все же последнее с диапазоном где -3 и 15 не врубился...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.03.2015, 14:42     Как генерировать случайные числа?
Еще ссылки по теме:

создать программу которая будет генерировать пяти и шестизначные числа на экран C++
Создайте программу, которая будет генерировать и отображать пяти- и шестизначные числа на экран C++
C++ Как получить случайные отрицательные числа

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

Или воспользуйтесь поиском по форуму:
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
23.03.2015, 14:42     Как генерировать случайные числа? #13
System16v, я уже сказал. Выражение rand() % n вернёт значение от 0 до n-1.
Yandex
Объявления
23.03.2015, 14:42     Как генерировать случайные числа?
Ответ Создать тему
Опции темы

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