Generare numeri casuali in Ruby: Guida 2026

1 ottobre 2025

Random number generation is a fundamental concept in programming, used in applications ranging from simulations and games to cryptography and statistical analysis. Ruby, a dynamic and object-oriented programming language, provides robust tools for generating random numbers. This article explores Ruby’s random number generation capabilities, covering built-in methods, advanced techniques, and practical applications. We’ll dive into the Random class, the rand method, seeding, secure ruby random numbers, and real-world use cases, ensuring a thorough understanding for developers at all levels.

1. Introduction to Random Numbers in Ruby

Random numbers are essential in programming for tasks like generating unique identifiers, simulating unpredictable events, or implementing cryptographic algorithms. In Ruby, random number generation is straightforward yet powerful, thanks to its built-in classes and methods. Ruby provides two primary ways to generate random numbers:

  • The rand method, available globally.
  • The Random class, offering fine-grained control over random number generation.

Whether you need a simple random integer or a cryptographically secure random string, Ruby has you covered. Let’s start with the basics.

2. The rand Method: Simple Random Number Generation

IL rand method is Ruby’s most accessible tool for generating random numbers. It’s available globally, requiring no explicit class instantiation. Here’s how it works:

2.1 Basic Usage of rand

Without arguments, rand returns a random float between 0.0 (inclusive) and 1.0 (exclusive):

ruby
puts rand  # => 0.7239428374 (example output)

To generate a random integer within a specific range, pass an integer or a range:

ruby
puts rand(10)      # => Random integer from 0 to 9
puts rand(1..10)   # => Random integer from 1 to 10

2.2 Generating Floats in a Range

To get a random float within a custom range, you can scale the output of rand:

ruby
min = 5.0
max = 10.0
random_float = min + (max - min) * rand
puts random_float  # => e.g., 7.29428374

2.3 Practical Example: Rolling a Die

A common use case is simulating a die roll:

ruby
def roll_die
rand(1..6)
end

puts roll_die  # => e.g., 4

IL rand method is simple and sufficient for many applications, but it uses Ruby’s global random number generator, which may not always be ideal for complex or secure applications. For more control, we turn to the Random class.

3. The Random Class: Advanced Random Number Generation

IL Random class, introduced in Ruby 1.9, provides a more flexible and controlled way to generate random numbers. It allows you to create independent random number generators, which is useful for reproducibility or parallel processes.

3.1 Creating a Random Instance

You can create a new Random instance with or without a seed:

ruby
rng = Random.new
puts rng.rand  # => Random float between 0.0 and 1.0
puts rng.rand(10)  # => Random integer from 0 to 9

3.2 Seeding for Reproducibility

Random numbers in Ruby are generated using a pseudorandom number generator (PRNG), specifically the Mersenne Twister algorithm. A PRNG produces deterministic sequences based on a seed value. By setting a seed, you can ensure the same sequence of random numbers is generated:

ruby
rng = Random.new(42)  # Set seed to 42
puts rng.rand  # => 0.3745401188473625
puts rng.rand  # => 0.9507143064099162

# Same seed, same sequence
rng2 = Random.new(42)
puts rng2.rand  # => 0.3745401188473625
puts rng2.rand  # => 0.9507143064099162

Seeding is useful for testing, simulations, or scenarios where you need reproducible results.

3.3 Generating Numbers with Random

IL Random class supports methods similar to rand:

  • rand(max): Generates a random integer from 0 to max-1.
  • rand(range): Generates a random integer within the given range.
  • rand: Generates a random float between 0.0 and 1.0.

Esempio:

ruby
rng = Random.new
puts rng.rand(100)      # => e.g., 42
puts rng.rand(1.0..5.0) # => e.g., 3.728493

4. Secure Random Numbers with SecureRandom

For applications requiring cryptographically secure random numbers—such as generating tokens, passwords, or encryption keys—Ruby’s SecureRandom module is the go-to choice. Unlike rand O Random, which use the Mersenne Twister (predictable if the seed is known), SecureRandom uses system-level randomness (e.g., /dev/urandom on Unix-like systems).

4.1 Using SecureRandom

IL SecureRandom module provides methods to generate random bytes, strings, and numbers. Require it before use:

ruby
require 'securerandom'

4.1.1 Generating Random Bytes

ruby
bytes = SecureRandom.random_bytes(16)  # => 16 random bytes
puts bytes.inspect

4.1.2 Generating Hex Strings

ruby
hex = SecureRandom.hex(8)  # => 16-character hexadecimal string
puts hex  # => e.g., "a1b2c3d4e5f6g7h8"

4.1.3 Generating Base64 Strings

ruby
base64 = SecureRandom.base64(12)  # => Base64-encoded random string
puts base64  # => e.g., "XjY2Nzg5MDEyMzQ="

4.1.4 Generating UUIDs

ruby
uuid = SecureRandom.uuid  # => e.g., "550e8400-e29b-41d4-a716-446655440000"
puts uuid

4.1.5 Generating Random Numbers

ruby
number = SecureRandom.random_number(100)  # => Random integer from 0 to 99
puts number

4.2 When to Use SecureRandom

Utilizzo SecureRandom for:

  • Generating API keys or session tokens.
  • Creating secure passwords.
  • Cryptographic operations requiring high entropy.
  • Any scenario where predictability could compromise security.

Evitare SecureRandom for non-security-critical tasks, as it’s slower than rand O Random.

5. Practical Applications of Random Numbers in Ruby

Let’s explore real-world use cases to see how Ruby’s random number generation shines.

5.1 Shuffling Arrays

Randomly shuffling an array is a common task in games, quizzes, or sampling. Ruby’s Array#shuffle method uses the global random number generator, but you can pass a Random instance for control:

ruby
numbers = [1, 2, 3, 4, 5]
rng = Random.new(42)
puts numbers.shuffle(random: rng)  # => [4, 2, 5, 1, 3]

5.2 Generating Random Strings

For generating random alphanumeric strings (e.g., for temporary IDs), you can combine rand O SecureRandom with a character set:

ruby
chars = ('a'..'z').to_a + ('0'..'9').to_a
random_string = 8.times.map { chars[rand(chars.length)] }.join
puts random_string  # => e.g., "k7n4p8m2"

# Using SecureRandom for security
secure_string = SecureRandom.alphanumeric(8)
puts secure_string  # => e.g., "Kj9mP2vN"

5.3 Simulating Random Events

Random numbers are ideal for simulations, such as modeling a coin flip:

ruby
def coin_flip
  rand(2) == 0 ? "Heads" : "Tails"
end

10.times { puts coin_flip }  # Simulates 10 coin flips

5.4 Generating Test Data

When testing applications, random data can simulate user input:

ruby
require 'securerandom'

def generate_user
  {
    id: SecureRandom.uuid,
    age: rand(18..80),
    email: "user#{rand(1000)}@example.com"
  }
end

puts generate_user.inspect

5.5 Random Sampling

Ruby’s Array#sample method selects random elements from an array, optionally using a Random instance:

ruby
items = %w[apple banana cherry date]
rng = Random.new
puts items.sample(2, random: rng)  # => e.g., ["banana", "date"]

6. Performance Considerations

While Ruby’s random number generation is efficient for most tasks, there are performance trade-offs:

  • Global rand: Fastest for general use, as it uses the global PRNG.
  • Random class: Slightly slower due to instance management but offers better control.
  • SecureRandom: Slowest due to its reliance on system-level randomness, suitable only for security-critical tasks.

For performance-critical applications, benchmark your code using Ruby’s Benchmark module:

ruby
require 'benchmark'

n = 1_000_000
Benchmark.bm do |x|
  x.report("rand:") { n.times { rand(100) } }
  x.report("Random:") { rng = Random.new; n.times { rng.rand(100) } }
  x.report("SecureRandom:") { n.times { SecureRandom.random_number(100) } }
end

Sample output:
      user     system      total        real
rand:  0.120000   0.000000   0.120000 (  0.123456)
Random: 0.150000   0.000000   0.150000 (  0.154321)
SecureRandom: 2.500000   0.010000   2.510000 (  2.543210)

7. Best Practices and Tips for Ruby Random Numbers

  • Choose the Right Tool: Use rand for simple tasks, Random for controlled sequences, and SecureRandom for security-critical applications.
  • Seed Wisely: Use seeds for reproducibility in testing, but avoid them in production unless necessary.
  • Avoid Predictability: Never use rand O Random for cryptographic purposes, as their sequences can be predicted if the seed is known.
  • Test Randomness: For statistical applications, verify the distribution of your random numbers using libraries like distribution or statistical tests.
  • Thread Safety: The global rand method is not thread-safe. Use separate Random instances for each thread in multi-threaded applications.

8. Advanced Ruby Random Numbers

8.1 Custom Random Number Generators

You can implement your own PRNG by subclassing Random::Formatter or using external libraries like random/ran for specialized algorithms.

8.2 Statistical Randomness

For applications requiring specific distributions (e.g., Gaussian), consider gems like distribution:

ruby
require 'distribution'
rng = Distribution::Normal.rng
puts rng.call  # => Random number from a normal distribution

8.3 Cryptographic Enhancements

For advanced cryptographic needs, combine SecureRandom with libraries like openssl for tasks like key generation or digital signatures.

9. Conclusion

Ruby’s random number generation capabilities are versatile and cater to a wide range of needs, from simple integer generation with rand to cryptographically secure strings with SecureRandom. By understanding the Random class, seeding, and secure random generation, developers can build robust applications for simulations, games, test, and security. Whether you’re rolling a virtual die or generating a secure API token, Ruby provides the tools to do it efficiently and reliably.

By following best practices and choosing the appropriate method for your use case, you can harness the power of randomness in Ruby to create dynamic, unpredictable, and secure applications. Experiment with the examples provided, and explore Ruby’s documentation for deeper insights into its random number generation capabilities.

A Carmatec, our Ruby on Rails experts leverage these capabilities to build scalable, secure, and high-performance applications. From enterprise-grade solutions to custom APIs, we ensure the right randomization techniques are applied to enhance security, performance, and reliability—helping businesses innovate with confidence.