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

 


Зв’язані теми