Генерация псевдослучайных чисел

Для генерации псевдослучайных чисел используются следующие функции:

  • rand() — генерирует псевдослучайное число от 0 до RAND_MAX. Прототип функции и определение макроса RAND_MAX:
#include <cstdlib> /* или #include <stdlib.h> */
int rand(void);
#define RAND_MAX 0x7fff

Пример:

std::cout << std::rand() << std::endl;  // 41
std::cout << std::rand() << std::endl;  // 18467
std::cout << RAND_MAX << std::endl;     // 32767

Чтобы получить случайное число от 0 до определенного значения, а не до RAND_MAX, следует использовать оператор % для получения остатка от деления. Пример получения числа от 0 до 10 включительно:

std::cout << std::rand() % 11 << std::endl;

Чтобы получить случайное число от rmin до определенного значения rmax (не включая это значение), например, от 5 до 10 включительно, можно воспользоваться следующим кодом:

int rmin = 5, rmax = 11;
std::cout << rmin + std::rand() % (rmax - rmin) << std::endl;
  • srand() — настраивает генератор случайных чисел на новую последовательность. В качестве параметра обычно используется значение, возвращаемое функцией time() с нулевым указателем в качестве параметра.  Функция time() возвращает количество секунд, прошедшее с 1 января 1970 г. Прототипы функций:
#include <cstdlib> /* или #include <stdlib.h> */
void srand(unsigned int seed);
#include <ctime> /* или #include <time.h> */
time_t time(time_t *time);

Пример:

std::srand(static_cast<unsigned int>( std::time(nullptr) ));
std::cout << std::rand() << std::endl;
std::cout << std::rand() << std::endl;
std::cout << std::rand() << std::endl;

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

std::srand(100);
std::cout << std::rand() << std::endl; // 365
std::srand(100);
std::cout << std::rand() << std::endl; // 365

В качестве примера создадим генератор паролей произвольной длины (листинг 5.3). Для этого добавляем в массив arr все разрешенные символы, а далее в цикле получаем случайный элемент из массива. Затем записываем символ, который содержит элемент массива, в итоговый символьный массив, адрес первого элемента которого передан в качестве первого параметра. В конец символьного массива вставляем нулевой символ. Следует учитывать, что символьный массив должен быть минимум на один символ больше, чем количество символов в пароле.

Листинг 5.3. Генератор паролей

#include <iostream>
#include <cstdlib>
#include <ctime>

void passw_generator(char *pstr, int count_char);

int main() {
   char str[80] = "";
   std::srand(static_cast<unsigned int>( std::time(nullptr) ));
   passw_generator(str, 8);
   std::cout << str << std::endl; // Выведет примерно QoNvNx7S
   passw_generator(str, 8);
   std::cout << str << std::endl; // 9csvgOaA
   passw_generator(str, 10);
   std::cout << str << std::endl; // gjDNM9dKtS
   return 0;
}
void passw_generator(char *pstr, int count_char) {
    const short SIZE = 62;
    char arr[SIZE] = {'a','b','c','d','e','f','g','h','i','j',
    'k','l','m','o','n','p','q','r','s','t','u','v','w','x','y','z',
    'A','B','C','D','E','F','G','H','I','J','K','L',
    'M','N','O','P','Q','R','S','T','U','V','W',
    'X','Y','Z','1','2','3','4','5','6','7','8','9','0'};
    for (int i = 0; i < count_char; ++i) {
       *pstr = arr[std::rand() % SIZE];
       ++pstr;
    }
    *pstr = '\0';
}
Примечание

Учебник C++ (MinGW-W64)
Учебник C++ (MinGW-W64) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов