Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.88/104: Рейтинг темы: голосов - 104, средняя оценка - 4.88
knf
16 / 16 / 8
Регистрация: 18.09.2012
Сообщений: 184
#1

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

02.03.2013, 20:56. Просмотров 19087. Ответов 12
Метки нет (Все метки)

Как в с++ с генерировать, например положительные числа от 0 до 10? знаю, что есть генератор rand в библиотеке stdlib.h, но не знаю, как он работает и как вообще им пользоваться.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.03.2013, 20:56
Ответы с готовыми решениями:

Как реализовать случайные числа?
Здравствуйте. я озадачен тем что ещё нигде не смог найти нормального способа...

Как получить случайные отрицательные числа
всем доброго времени суток как сделать что-бы генератор ниже генерировал...

Как сгенерировать случайные числа в заданном интервале?
как правильно сгенерировать вещественный массив на промежутке mas =...

как в массив записать случайные числа но чтобы не повторялись
Как в массив записать случайные числа но чтобы не повторялись?? Пишу программу...

Нужно чтобы случайные числа вставали в конец массива,а не удаляли числа
#include <iostream> using namespace std; void main() { setlocale(LC_ALL,...

12
Ev[G]eN
iOS/Android Developer
Эксперт С++
5116 / 1554 / 950
Регистрация: 23.01.2011
Сообщений: 3,184
Завершенные тесты: 1
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;
}
3
BumerangSP
4287 / 1409 / 463
Регистрация: 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 секунд

Не по теме:

эх =(

2
knf
16 / 16 / 8
Регистрация: 18.09.2012
Сообщений: 184
02.03.2013, 21:26  [ТС] #4
А теперь можно ли объяснить?)
0
Pepsy
47 / 32 / 9
Регистрация: 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.

Не по теме:

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

2
NeonLost
Пес войны
110 / 87 / 22
Регистрация: 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;
}
0
knf
16 / 16 / 8
Регистрация: 18.09.2012
Сообщений: 184
02.03.2013, 23:09  [ТС] #7
NeonLost, Темой не ошибся?)
0
NeonLost
Пес войны
110 / 87 / 22
Регистрация: 23.02.2012
Сообщений: 653
02.03.2013, 23:28 #8
Цитата Сообщение от knf Посмотреть сообщение
NeonLost, Темой не ошибся?)
ну ты спрашивал про С++, а rand это вроде сишная функция...)
0
silent_1991
Эксперт С++
5009 / 3069 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 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);
1
System16v
3 / 3 / 1
Регистрация: 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 неправильно за диапазоном.Во прикол...
0
silent_1991
Эксперт С++
5009 / 3069 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
23.03.2015, 14:18 #11
System16v, смотрите: выражение rand() % 1112 вернёт значение от 0 до 1111. А вы к этому значению ещё 1000 прибавляете. Понятно, что если rand() % 1112 вернул значение больше 112, то результат выражения выйдет за диапазон. Поэтому ван нужно брать по модулю не 1112, а по модулю 1112-1000 (т.е. верхняя граница минус нижняя граница).
Ну и кроме того, по условию задачи все интервалы открытые (неравенства нестрогие), а у вас все интервалы полуоткрытые (верхняя граница не попадёт в диапазон, а вот нижняя очень даже может попасть).
Ещё у меня вызывает вопрос самое первое задание. Если речь только о целых числах, то оно невыполнимо. Не существует целого числа, которое было бы строго больше 1 и в то же время строго меньше 2. Если речь о действительных числах, то алгоритм генерации значений нужен другой.
0
System16v
3 / 3 / 1
Регистрация: 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 не врубился...
0
silent_1991
Эксперт С++
5009 / 3069 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
23.03.2015, 14:42 #13
System16v, я уже сказал. Выражение rand() % n вернёт значение от 0 до n-1.
0
23.03.2015, 14:42
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.03.2015, 14:42

создать программу которая будет генерировать пяти и шестизначные числа на экран
Помогите создать программу которая будет генерировать пяти и шестизначные числа...

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

Случайные числа от 1 до 9
Можно так создавать случайные числа от 1 до 9 void main() {...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

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