require 'securerandom'
# Module providing cryptographically secure 8-digit number and code generators.
module RandomCodeGenerator
MIN_INTEGER = 10_000_000
MAX_INTEGER = 99_999_999
module_function
# Generates a random 8-digit positive integer between 10,000,000 and 99,999,999 (inclusive).
# Guaranteed to start with a non-zero digit (1-9).
#
# @return [Integer] An 8-digit positive integer.
def generate_8_digit_number
# SecureRandom.random_number(range) accepts a Range object and handles inclusive bounds natively
SecureRandom.random_number(MIN_INTEGER..MAX_INTEGER)
end
# Generates an 8-character numeric string code between "00000000" and "99999999".
# Preserves leading zeros, making it suitable for OTPs, PINs, or verification tokens.
#
# @return [String] An 8-character numeric string padded with leading zeros if necessary.
def generate_8_digit_code
# SecureRandom.random_number(n) returns an integer in the range [0, n - 1]
raw_value = SecureRandom.random_number(100_000_000)
# Kernel#sprintf or String#% formats the integer with 8 digits and leading zeros (%08d)
format('%08d', raw_value)
end
end
# ==========================================
# Example Execution & Usage
# ==========================================
if __FILE__ == $PROGRAM_NAME
puts '=== Generating 8-Digit Integers [10000000 to 99999999] ==='
3.times do
number = RandomCodeGenerator.generate_8_digit_number
puts "Generated integer: #{number}"
end
puts "\n=== Generating 8-Digit String Codes [00000000 to 99999999] ==="
3.times do
code = RandomCodeGenerator.generate_8_digit_code
puts "Generated OTP code: #{code}"
end
end
# run:
#
# === Generating 8-Digit Integers [10000000 to 99999999] ===
# Generated integer: 58343688
# Generated integer: 18510048
# Generated integer: 49900293
#
# === Generating 8-Digit String Codes [00000000 to 99999999] ===
# Generated OTP code: 87737505
# Generated OTP code: 24294425
# Generated OTP code: 83647461
#