#include <iostream>
#include <random>
#include <string>
#include <iomanip>
#include <sstream>
/**
* Class responsible for generating random numbers and codes.
* Encapsulating state ensures proper seeding and thread-safe engine handling.
*/
class RandomGenerator {
public:
RandomGenerator()
// Seed the Mersenne Twister generator using non-deterministic hardware entropy
: rd_(), gen_(rd_()) {}
/**
* Generates an 8-digit random integer between 10,000,000 and 99,999,999 (inclusive).
* Guaranteed no leading zeros (starts with 1-9).
*
* @return An 8-digit integer value.
*/
long generate8DigitNumber() {
// Uniform distribution across [10,000,000, 99,999,999]
std::uniform_int_distribution<long> dist(10'000'000L, 99'999'999L);
return dist(gen_);
}
/**
* Generates an 8-digit string code between "00000000" and "99999999".
* Preserves leading zeros using string formatting, suitable for OTPs/PINs.
*
* @return An 8-character numeric std::string.
*/
std::string generate8DigitCode() {
std::uniform_int_distribution<long> dist(0L, 99'999'999L);
long raw_value = dist(gen_);
std::ostringstream oss;
// Format with leading zeros to guarantee exact 8-character width
oss << std::setw(8) << std::setfill('0') << raw_value;
return oss.str();
}
private:
std::random_device rd_; // Hardware entropy source for seeding
std::mt19937 gen_; // Mersenne Twister 19937 PRNG engine
};
int main() {
// Instantiate the generator (seeds engine once upon creation)
RandomGenerator rng;
// 1. Generate an 8-digit mathematical integer [10000000, 99999999]
long random_number = rng.generate8DigitNumber();
std::cout << "Generated 8-digit integer: " << random_number << '\n';
// 2. Generate an 8-digit string code [00000000, 99999999] preserving leading zeros
std::string random_code = rng.generate8DigitCode();
std::cout << "Generated 8-digit string code: " << random_code << '\n';
}
/*
run:
Generated 8-digit integer: 93425832
Generated 8-digit string code: 68581270
*/