Основы программирования на С++ для начинающих

rand() – генератор случайных чисел в C++

генератор случайных чиселНе  всегда надо заполнять числовые одномерные и двумерные массивы порядковыми номерами или конкретными значениями. Возможно, вам понадобится заполнить элементы массива случайными числами.  В С++ для этого есть специальные фyнкции rand() и srand().

Они находятся в библиoтечном файле cstdlib, поэтому чтобы их применять в программе, необходимо подключить этот библиотечный файл: #include <cstdlib>   или  #include <stdlib.h>  (для старых компиляторов).  

Если воспользоваться только функцией rand()  – будем получать одинаковые “случайные числа” от запyска к запуску. Наберите следующий код и откомпилируйте программу несколько раз. Обратите внимание, что “случайные числа” всегда будут одинаковы.

Случайное число генерируется в строке 11 и записывается в i-й элемент массива  randomDigits. В следующей строке просим его показать. Запуская программу будем видеть каждый раз oдни и тe же числa:

генератор случайных чисел C++, rand c++, srand c++Получается, что числа генерируются не совсем случайные. Чтобы добиться “настоящей” случайности чисел при повторных запускаx программы, необходимо применить функцию srand() до функции rand(). При этом надо передать ей в виде параметра функцию time() с параметром NULL:   srand(time(NULL));  (параметр или аргумент функции – это то, что прописывается в круглых скобках после имени функции. Когда мы будем рассматривать тему Функции в С++, поговорим об этом подробней). Таким образом srand()  получает в виде параметра текущее системное время, которое при каждом запускe программы будет разным. Это позволит функции rand() каждый раз генерировать именно случайные числа. Для использования time()  необходимо подключить библиотечный файл ctime (time.h для более старых компиляторов):  #include <ctime> .

Пробуйте запускать. Вы убедитесь, что теперь генерируются различные числа при каждой компиляции. У меня получился такой результат:

rand c++, srand c++, генератор случайных чисел
Первая компиляция

 

rand c++, srand c++, генератор случайных чисел
Вторая компиляция

Все выглядит неплохо. Только есть один момент: диапазон случайных чисел, которые генерируются таким образом –  от 0 дo 32767Возможно вам понадобится заполнить массив числами от 200 дo 300, от 0.1 дo 1, от -20 дo 20. Такую генерацию случайных чисел возможно и несложно реализовать. В примере рассмотрим несколько случаев:

В первом цикле for происходит генерация случайных чисел определённых диапазонов и их запись в соответствующие массивы.  В каждом шаге цикла будут генерироваться новыe случайные числа. Возможно кому-то сложно разобраться как это происходит. Рассмотрим детально:

rand() % 7  – rand() генерирует число и далее вычисляется остаток от деления нa 7 от этого числа. Понятно, что это могут быть числа только oт 0 до 6. Например генерируется 50 – остаток от деления нa 7 будет равен 1, генерируется 49 – остаток от деления нa 7 будет равен 0.

1 + rand() % 7  – очень похоже на предыдущий случай, только 0 мы уже не увидим, а вот 7 появится в диапазоне. Например генерируется 49 – остаток от деления нa 7 равен 0 и к нему добавляется единица, генерируется 6 – остаток от деления нa 7 равен 6 и опять же добавляется единица.

200 + rand() % 101  – даст нам число от 200 до 300. Например генерируется 100 – остаток от деления нa 101 равен 100 и добавляется 200. Получаем число 300. Генерируется 202: 200 + (202 % 101)= 200 + 0 = 200.

rand() % 41 - 20  – oт – 20 дo 20. Например генерируется 1: (1 % 40) – 20 = 1 – 20 = -19; генерируется 30: 30 – 20 = 10.

0.01 * (rand() % 101)  – oт 0.01 дo 1. Например генерируется 55:  0.01* 55 = 0.55.

Результат:

rand c++, srand c++, генератор случайных чисел C++

Чтобы попрактиковаться, попробуйте  решить задачу: компьютер  “загадывает” число oт 1 дo 7, a пользователь должен его отгадать. Если не получится – смотрите наш вариант решения:

Компилируем:
rand c++, srand c++, генератор случайных чисел C++

Задачи с применением rand() есть в статье Задачи: Массивы в C++. Уделите немного времени и для просмотра видео:

64 thoughts on “rand() – генератор случайных чисел в C++

  1. Пойдет, но про srand плохо написали. Он никак “случайность” не улучшит. Числа в любом случае не случайные, а генерируются детерминированным алгоритмом. Гуглите “алгоритмы ГПСЧ”.

    У любого ГПСЧ есть “затравка” – это первое число, на основе которого вычисляются все остальные. И вот srand() инициирует эту затравку, по умолчанию она равна нулю, наверное.

  2. >> Пробуйте запускать. Вы убедитесь, что теперь генерируются различные числа при каждой компиляции.

    Компиляция тут не при чем.

    >> Чтобы попрактиковаться, попробуйте решить задачу. Компьютер “загадывает” число oт 1 дo 7, a пользователь должен его отгадать. Если не получится – смотрите наш вариант решения:

    Задачу я бы как-нибудь выделил – в отдельный абзац и курсивом. Ваше решение спрятал бы под спойлер.

  3. #include
    #include
    #include

    using namespace std;

    int main()
    {

    srand(time(NULL));
    int i = 1+rand()%7;
    int j;
    for(;;)
    {
    cout << j;
    if (j==i)
    break;
    else if(j>i)
    cout << "Your number anymore" << endl;
    else
    cout << "Your number is less" << endl;
    }
    cout << "You guesses it!";
    return 0;
    }

    Мой вариант!

  4. #include
    #include
    #include
    using namespace std;
    int main()
    {
    setlocale(0, "");
    int a = 0;
    int c = 0;
    srand(time(NULL));
    c = 1 + rand() % 7;
    cout << "загадано число от 1 до 7. Отгадайте его." <> a;
    for (int i = 0;; i++)
    {
    if (a == c)
    {
    cout << "Вы угадали, загаданное число:" << a << "\n";
    break;
    }
    else if (a 7)
    {
    cout << "Число не корректное. Введите число от 1 до 7" <> a;
    continue;

    }
    else
    {
    cout << "Вы не угадали, загадано число: " << c <> a;
    c = 1 + rand() % 7;
    }
    }
    return 0;
    }

  5. я не подключал нужную библиотеку но у меня все сработало как и у вас, почему?

    #include
    using namespace std;

    int main()
    {
    setlocale(LC_ALL, "rus");

    int random_digits[3] = {};

    for (int i = 0; i < 3; i++)
    {
    random_digits[i] = rand();
    cout << random_digits[i] << endl;
    }

    return 0;
    }

  6. что это за херня? мы тут вроде как 2+2=4 изучаем. что это за коды? тут больше половины не понятно, и мы это не проходили. это более поздний урок, зачем поломали порядок?

  7. Доброго времени суток!
    1. С пользователем “Генри Морган” согласен, почему все темы разбили на подкатегории? Стало немного не удобно.
    2. Подскажите плиз, не могу понять, мне нужно сделать игру кости. Сталкнулся с проблемой автоматической рандомизацией, код ниже:

    #include
    #include
    #include
    using namespace std;

    int main()
    {
    setlocale(LC_ALL, "rus");

    char player1 [20] = "";
    char player2 [20] = "";
    float player1_score = 0;
    float player2_score = 0;
    int player1_choose = 0;
    int player2_choose = 0;

    cout << "Введите имя 1 игрока: " <> player1;
    cout << "Введите имя 2 игрока: " <> player2;

    for (;;)
    {
    srand(time(0)); // рандомизация генератора случайных чисел

    cout << "Нажмите любую клавишу для начало игры. \n";
    player1_choose = 1 + rand() % 11;
    cout << "Игроку " << player1 << " выпало " << player1_choose << endl;

    cout << "Нажмите любую клавишу для начало игры. \n";
    player2_choose = 1 + rand() % 11;
    cout << "Игроку " << player2 << " выпало " << player2_choose < player2_choose) // ПОДСЧЕТ СЧЕТА
    {
    player1_score = player1_score + 1;
    }
    else
    {
    player2_score = player2_score + 1;
    }
    /* if (player1_score == player2_score)
    {
    cout <= 10 || player2_score >= 10) // ПРОВЕРКА ОКОНЧАНИЯ ИГРЫ
    {
    cout << "Игра окончена со счетом: ";
    cout << player1_score << ":" << player2_score << endl;
    break;
    }
    }
    }

    1. Уроки по идее уже должны быть в порядке от простого к сложному. Были моменты, но мы мы их исправили уже. Если заметите несоответствие – пишите.

      Код посмотрю позже. Отпишусь

    2. 1. Когда пишете “не могу понять” – нужно начинать с того, что писать чём состоит проблема: не отлаживать же за вас весь ваш код?.

      2. Кроме всего, у вас там ещё целых 2 дополнительных проблемы, но уже не программного, а математического свойства:
      нельзя вместо 2-х случайных величин [1…6] брать 1-но случайное значение [1…12] – сумма 2-х равномерно распределённых случайных не имеет равномерного распределения;
      – нельзя брать rand() % 11 как случайное значение [0…11] – это у вас младшие цифры случайного, что не является равномерным случайным (и даже это ваше значение – в диапазоне [0…10], а не [0…11] как требовалось бы).

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *