C++. Генерирование случайных чисел. Функции rand(), srand(), time(). Примеры





Генерирование случайных чисел. Функции rand(), srand(), time(). Примеры


Содержание


Поиск на других ресурсах:

1. Как в C++ сгенерировать случайное число? Функция rand(). Пример

В языке C++ существуют средства для генерирования случайных чисел. Чтобы сгенерировать случайное число используется функция rand(), которая размещается в библиотечном файле stdlib.h. Синтаксис объявления функции следующий:

int rand();

Функция возвращает случайное целочисленное значение, которое лежит в пределах от 0 до 32767.

Пример.

#include <iostream>
#include <stdlib.h>
using namespace std;

void main()
{
  // Получить случайное число
  int x;
  x = rand();
  cout << "x = " << x << endl;

  // Получить еще одно случайное число
  int y;
  y = rand();
  cout << "y = " << y << endl;
}

Результат выполнения программы

x = 41
y = 18467

 

2. Функция srand(). Назначение. Пример

Если несколько раз запустить текст программы из п. 1, то будет получен один и тот же результат (одни и те же числа). Значит, сама по себе функция rand() генерирует одни и те же последовательности чисел. Чтобы получить разные последовательности чисел нужно объединить функцию rand() с функцией srand().

Функция srand() из библиотеки stdlib.h предназначена для установки начальной точки, из которой происходит генерирование случайных чисел. Синтаксис объявления функции следующий:

void srand(unsigned int startValue);

здесь startValue – целочисленное значение, которое служит отправной точкой для генерирования последовательности случайных чисел функцией rand(). Изменяя значение startValue, можно получать разные последовательности случайных чисел.

Пример.

#include <iostream>
#include <stdlib.h>
using namespace std;

void main()
{
  // Установить начальную точку генерирования последовательности
  srand(55);

  // Получить случайное число
  int x;
  x = rand();
  cout << "x = " << x << endl;

  // Получить еще одно случайное число
  int y;
  y = rand();
  cout << "y = " << y << endl;
}

Результат выполнения программы

x = 218
y = 9057

 

3. Функция time(). Назначение. Сочетание функций rand(), srand(), time(). Пример

Как видно из примера в п. 2, последовательность случайных чисел изменилась. Если в функции srand() вместо числа 55 установить другое число, то будет получена другая последовательность. Однако, текст программы статический и при многократном запуске программы это число будет неизменным. В результате будет получаться одна и та же последовательность случайных чисел. Во избежание этого недостатка, нужно чтобы стартовое значение в функции srand() постоянно изменялось.

Для того, чтобы в функции srand() получить разные начальные значения используется функция time() из библиотеки time.h.

Если функцию time() вызвать с параметром NULL, то эта функция возвратит количество миллисекунд, которые прошли с 1 января 1970 года. Значит, число миллисекунд будет зависеть от момента времени, в который пользователь запустил программу на выполнение. А этот момент каждый раз будет другим.

Если эти миллисекунды поместить в функцию srand() как показано ниже

srand(time(NULL));

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

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

#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;

void main()
{
  // Установить начальную точку генерирования последовательности
  // использовать функцию time(NULL)
  srand(time(NULL));

  // Получить случайное число
  int x;
  x = rand();
  cout << "x = " << x << endl;

  // Получить еще одно случайное число
  int y;
  y = rand();
  cout << "y = " << y << endl;
}

Результат выполнения программы

x = 19040
y = 24635

 

4. Как сгенерировать случайное целое число в заданных пределах? Пример

В примере приведена функция GetRandomNumber(), которая генерирует случайное число в заданных пределах.

#include <iostream>
#include <stdlib.h> // нужен для вызова функций rand(), srand()
#include <time.h> // нужен для вызова функции time()
using namespace std;

// Функция генерирования случайного целочисленного числа в указанных пределах.
// Диапазон чисел: [min, max]
int GetRandomNumber(int min, int max)
{
  // Установить генератор случайных чисел
  srand(time(NULL));

  // Получить случайное число - формула
  int num = min + rand() % (max - min + 1);

  return num;
}

void main()
{
  // Использование функции GetRandomNumber()
  int number;
  number = GetRandomNumber(-10, 10); // Диапазон чисел: [-10, 10]
  cout << "number = " << number << endl;;
}

 

5. Заполнение двумерной матрицы случайными целыми числами в указанных пределах. Пример

Условие задачи. Дана двумерная матрица порядка n (n столбцов, n строк) целых чисел. Найти наибольшее из значений элементов, которые размещены в закрашенной части матрицы. Значение элементов матрицы формируются случайным образом и находятся в пределах [-5; +5].

Текст программы следующий

#include <iostream>
#include <stdlib.h> // нужен для вызова функции rand(), srand()
#include <time.h> // нужен для вызова функции time()
using namespace std;

void main()
{
  // Двумерные массивы.
  // Вычислить максимальный элемент нижней части матрицы

  // 1. Объявление переменных
  const int MAX_N = 10; // максимально-допустимая размерность матрицы
  const int MIN_VALUE = -5; // максимальное значение элементов матрицы
  const int MAX_VALUE = 5; // минимальное значение
  int A[MAX_N][MAX_N]; // исходная матрица
  int n; // текущий размер матрицы n*n
  int max; // результат - максимальное значение

  // 2. Ввод n
  cout << "n = ";
  cin >> n;

  // 3. Проверка n на корректность
  if ((n <= 1) || (n > MAX_N))
  {
    cout << "Wrong size of array." << endl;
    return;
  }

  // 4. Формирование матрицы A случайных чисел,
  // установить генератор случайных чисел
  srand(time(NULL));

  for (int i = 0; i < n; i++)
    for (int j = 0; j < n; j++)
    {
      // взять случайное число
      A[i][j] = MIN_VALUE + rand() % (MAX_VALUE - MIN_VALUE + 1);
    }

  // 5. Вывести массив A для проверки
  cout << endl << "Array A:" << endl;
  for (int i = 0; i < n; i++)
  {
    for (int j = 0; j < n; j++)
      cout << A[i][j] << '\t';
    cout << endl;
  }

  // 6. Вычисление максимального значения
  bool f_first = true; // флажок первого элемента

  for (int i = 0; i < n; i++) // i - строки
    for (int j = 0; j < i; j++) // j - столбцы
      if (f_first)
      {
        // первый элемент принимается максимальным
        max = A[i][j];
        f_first = false;
      }
      else
      {
        if (max < A[i][j])
          max = A[i][j];
      }

  // 7. Вывод результата
  cout << endl << "max = " << max << endl;
}

 

6. Как сгенерировать случайное число с плавающей запятой в указанных пределах? Пример

В примере демонстрируется функция GetRandomNumberFloat(), которая генерирует случайное число с плавающей запятой в указанных пределах.

#include <iostream>
#include <stdlib.h> // нужен для вызова функции rand(), srand()
#include <time.h> // нужен для вызова функции time()
using namespace std;

// Функция, которая генерирует случайное число с плавающей запятой и указанной точностью
// Функция получает 3 параметра:
// - min - нижний предел;
// - max - верхний предел;
// - precision - точность, количество знаков после комы.
double GetRandomNumberFloat(double min, double max, int precision)
{
  // Установить стартовую точку
  srand(time(NULL));

  double value;

  // получить случайное число как целое число с порядком precision
  value = rand() % (int)pow(10, precision);

  // получить вещественное число
  value = min + (value / pow(10, precision)) * (max - min);

  return value;
}

void main()
{
  // Использование функции GetRandomNumberFloat()
  double number;

  srand(time(NULL));

  // Получить число в диапазоне [0; 2] с точностью 2 знака после запятой
  number = GetRandomNumberFloat(0, 2, 2);
  cout << "number = " << number << endl;
}

 


Связанные темы