Générer des nombres aléatoires en Ruby : Guide 2026

1er octobre 2025

La génération de nombres aléatoires est un concept fondamental en programmation, utilisé dans des applications allant des simulations et des jeux à la cryptographie et à l’analyse statistique. Ruby, un langage de programmation dynamique et orienté objet, offre des outils performants pour générer des nombres aléatoires. Cet article explore les capacités de Ruby en matière de génération de nombres aléatoires, en abordant les méthodes intégrées, les techniques avancées et les applications pratiques. Nous allons nous intéresser de près à la classe Random, à la méthode rand, à l'initialisation et à la sécurité nombres aléatoires en Ruby, et des cas d'utilisation concrets, afin de garantir une compréhension approfondie aux développeurs de tous niveaux.

1. Introduction aux nombres aléatoires en Ruby

Les nombres aléatoires sont indispensables en programmation pour des tâches telles que la génération d'identifiants uniques, la simulation d'événements imprévisibles ou la mise en œuvre d'algorithmes cryptographiques. En Ruby, la génération de nombres aléatoires est à la fois simple et puissante, grâce à ses classes et méthodes intégrées. Ruby propose deux méthodes principales pour générer des nombres aléatoires :

  • La méthode `rand`, disponible dans tout l'environnement.
  • La classe `Random`, qui permet un contrôle précis de la génération de nombres aléatoires.

Que vous ayez besoin d'un simple nombre entier aléatoire ou d'une chaîne aléatoire cryptographiquement sécurisée, Ruby a ce qu'il vous faut. Commençons par les bases.

2. Le rand Méthode : génération de nombres aléatoires simples

Le rand La méthode `random` est l'outil le plus accessible de Ruby pour générer des nombres aléatoires. Elle est disponible au niveau global et ne nécessite aucune instanciation explicite d'une classe. Voici comment elle fonctionne :

2.1 Utilisation de base de rand

Sans argument, la fonction `rand` renvoie une valeur flottante aléatoire comprise entre 0,0 (inclus) et 1,0 (non inclus) :

ruby
puts rand  # => 0,7239428374 (exemple de résultat)

Pour générer un nombre entier aléatoire compris dans un intervalle donné, passez un nombre entier ou un intervalle :

ruby
puts rand(10) # => Nombre entier aléatoire compris entre 0 et 9
puts rand(1..10)   # => Nombre entier aléatoire compris entre 1 et 10

2.2 Génération de nombres à virgule flottante dans un intervalle

Pour obtenir un nombre à virgule flottante aléatoire compris dans une plage personnalisée, vous pouvez mettre à l'échelle la sortie de rand:

ruby
min = 5.0
max = 10.0
random_float = min + (max - min) * rand
puts random_float  # => par exemple, 7.29428374

2.3 Exemple pratique : lancer un dé

Un cas d'utilisation courant consiste à simuler le lancer d'un dé :

ruby
def roll_die
rand(1..6)
end

puts roll_die  # => par exemple, 4

Le rand Cette méthode est simple et suffit pour de nombreuses applications, mais elle utilise le générateur de nombres aléatoires global de Ruby, ce qui n'est pas toujours idéal pour les applications complexes ou sécurisées. Pour bénéficier d'un meilleur contrôle, nous nous tournons vers le Au hasard classe.

3. Le Au hasard Cours : Génération avancée de nombres aléatoires

Le Au hasard La classe, introduite dans Ruby 1.9, offre un moyen plus souple et mieux contrôlé de générer des nombres aléatoires. Elle permet de créer des générateurs de nombres aléatoires indépendants, ce qui s'avère utile pour la reproductibilité ou les processus parallèles.

3.1 Création d'un Au hasard Instance

Vous pouvez créer un nouveau Au hasard instance avec ou sans graine :

ruby
rng = Random.new
puts rng.rand  # => Nombre aléatoire de type float compris entre 0,0 et 1,0
puts rng.rand(10)  # => Nombre entier aléatoire compris entre 0 et 9

3.2 Sélection des échantillons pour la reproductibilité

En Ruby, les nombres aléatoires sont générés à l'aide d'un générateur de nombres pseudo-aléatoires (PRNG), plus précisément l'algorithme Mersenne Twister. Un PRNG produit des séquences déterministes à partir d'une valeur de départ. En définissant une valeur de départ, vous pouvez vous assurer que la même séquence de nombres aléatoires sera générée :

ruby
rng = Random.new(42)  # Définition de la graine sur 42
puts rng.rand  # => 0.3745401188473625
puts rng.rand  # => 0,9507143064099162

# Même graine, même séquence
rng2 = Random.new(42)
puts rng2.rand  # => 0,3745401188473625
puts rng2.rand  # => 0,9507143064099162

L'initialisation est utile pour les tests, les simulations ou les scénarios dans lesquels vous avez besoin de résultats reproductibles.

3.3 Génération de nombres avec Au hasard

Le Au hasard La classe prend en charge des méthodes similaires à rand:

  • rand(max): Génère un nombre entier aléatoire compris entre 0 et max-1.
  • rand(plage): Génère un nombre entier aléatoire compris dans l'intervalle indiqué.
  • rand: Génère un nombre à virgule flottante aléatoire compris entre 0,0 et 1,0.

Exemple :

ruby
rng = Random.new
puts rng.rand(100) # => par ex. 42
puts rng.rand(1.0..5.0) # => par ex. 3,728493

4. Génération de nombres aléatoires sécurisés avec SecureRandom

Pour les applications nécessitant des nombres aléatoires cryptographiquement sûrs — comme la génération de jetons, de mots de passe ou de clés de chiffrement —, la fonctionnalité de Ruby SecureRandom Ce module est le choix incontournable. Contrairement à rand ou Au hasard, qui utilisent l'algorithme Mersenne Twister (prévisible si la graine est connue), SecureRandom utilise un générateur aléatoire au niveau du système (par exemple, /dev/urandom sur les systèmes de type Unix).

4.1 Utilisation SecureRandom

Le SecureRandom Ce module fournit des méthodes permettant de générer des octets, des chaînes de caractères et des nombres aléatoires. Il faut l'importer avant de l'utiliser :

ruby
require 'securerandom'

4.1.1 Génération d'octets aléatoires

ruby
bytes = SecureRandom.random_bytes(16)  # => 16 octets aléatoires
puts bytes.inspect

4.1.2 Génération de chaînes hexadécimales

ruby
hex = SecureRandom.hex(8)  # => chaîne hexadécimale de 16 caractères
puts hex  # => par exemple, " a1b2c3d4e5f6g7h8 "

4.1.3 Génération de chaînes Base64

ruby
base64 = SecureRandom.base64(12)  # => Chaîne aléatoire encodée en Base64
puts base64  # => par exemple, " XjY2Nzg5MDEyMzQ= "

4.1.4 Génération d'UUID

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

4.1.5 Génération de nombres aléatoires

ruby
number = SecureRandom.random_number(100)  # => Nombre entier aléatoire compris entre 0 et 99
puts number

4.2 Quand l'utiliser ? SecureRandom

Utilisation SecureRandom pour :

  • Génération de clés API ou de jetons de session.
  • Créer des mots de passe sécurisés.
  • Opérations cryptographiques nécessitant une entropie élevée.
  • Tout scénario dans lequel la prévisibilité pourrait compromettre la sécurité.

Éviter SecureRandom pour les tâches qui ne sont pas critiques en matière de sécurité, car il est plus lent que rand ou Au hasard.

5. Applications pratiques des nombres aléatoires en Ruby

Explorons quelques cas d'utilisation concrets pour découvrir en quoi la génération de nombres aléatoires en Ruby est particulièrement performante.

5.1 Mélanger des tableaux

Le mélange aléatoire d'un tableau est une opération courante dans les jeux, les quiz ou l'échantillonnage. En Ruby, Array#shuffle Cette méthode utilise le générateur de nombres aléatoires global, mais vous pouvez lui passer un Au hasard instance de contrôle :

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

5.2 Génération de chaînes aléatoires

Pour générer des chaînes alphanumériques aléatoires (par exemple, pour des identifiants temporaires), vous pouvez combiner rand ou SecureRandom avec un jeu de caractères :

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 Simulation d'événements aléatoires

Les nombres aléatoires sont parfaits pour les simulations, comme la modélisation d'un lancer de pièce :

ruby
def coin_flip
  rand(2) == 0 ? "Face" : "Pile"
end

10.times { puts coin_flip }  # Simule 10 lancers de pièce

5.4 Génération de données de test

Lors des tests d'applications, des données aléatoires peuvent simuler les saisies de l'utilisateur :

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 Échantillonnage aléatoire

Chez Ruby’s Array#sample Cette méthode sélectionne des éléments aléatoires dans un tableau, en utilisant éventuellement un Au hasard par exemple :

ruby
items = %w[pomme banane cerise datte]
rng = Random.new
puts items.sample(2, random: rng)  # => par exemple, ["banane", "datte"]

6. Considérations relatives aux performances

Bien que le générateur de nombres aléatoires de Ruby soit efficace pour la plupart des tâches, il présente certains inconvénients en termes de performances :

  • Mondial rand: C'est l'option la plus rapide pour une utilisation générale, car elle utilise le générateur de nombres aléatoires pseudo-aléatoires (PRNG) global.
  • Cours aléatoire: Légèrement plus lent en raison de la gestion des instances, mais offre un meilleur contrôle.
  • SecureRandom: C'est la méthode la plus lente car elle repose sur le hasard au niveau du système ; elle ne convient qu'aux tâches où la sécurité est primordiale.

Pour les applications où les performances sont essentielles, évaluez les performances de votre code à l'aide de Ruby’s Référence 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

Exemple de résultat :
 utilisateur     système total réel
rand :  0,120000   0,000000   0,120000 (  0,123456)
Aléatoire : 0,150000   0,000000   0,150000 (  0,154321)
SecureRandom : 2,500000   0,010000   2,510000 (  2,543210)

7. Bonnes pratiques et astuces pour générer des nombres aléatoires en Ruby

  • Choisissez l'outil adapté: Utilisation rand pour les tâches simples, Au hasard pour les séquences contrôlées, et SecureRandom pour les applications où la sécurité est primordiale.
  • Choisissez judicieusement vos semences: Utilisez des graines pour garantir la reproductibilité lors des tests, mais évitez de les utiliser en production, sauf en cas de nécessité.
  • Évitez la prévisibilité: N'utilisez jamais rand ou Au hasard à des fins cryptographiques, car leurs séquences peuvent être prédites si la graine est connue.
  • Test de caractère aléatoire: Pour les applications statistiques, vérifiez la distribution de vos nombres aléatoires à l'aide de bibliothèques telles que distribution ou des tests statistiques.
  • Sécurité des threads: Le mondial rand Cette méthode n'est pas sûre pour les threads. Utilisez une Au hasard des instances pour chaque thread dans les applications multithread.

8. Génération avancée de nombres aléatoires en Ruby

8.1 Générateurs de nombres aléatoires personnalisés

Vous pouvez implémenter votre propre générateur de nombres aléatoires pseudo-aléatoires (PRNG) en créant une sous-classe de Random::Formatter ou en utilisant des bibliothèques externes telles que aléatoire/ran pour des algorithmes spécialisés.

8.2 Aléatoire statistique

Pour les applications nécessitant des distributions spécifiques (par exemple, gaussiennes), pensez à utiliser des gemmes telles que distribution:

ruby
require 'distribution'
rng = Distribution::Normal.rng
puts rng.call  # => Nombre aléatoire issu d'une distribution normale

8.3 Améliorations cryptographiques

Pour les besoins cryptographiques avancés, combinez SecureRandom avec des bibliothèques telles que ouvressl pour des tâches telles que la génération de clés ou les signatures numériques.

9. Conclusion

Les fonctionnalités de génération de nombres aléatoires de Ruby sont polyvalentes et répondent à un large éventail de besoins, allant de la simple génération de nombres entiers avec rand pour sécuriser cryptographiquement des chaînes de caractères à l'aide de SecureRandom. En comprenant le Au hasard grâce aux notions de classe, de graine et de génération aléatoire sécurisée, les développeurs peuvent créer des applications robustes destinées aux simulations, aux jeux, essais, et la sécurité. Que ce soit pour lancer un dé virtuel ou générer un jeton API sécurisé, Ruby vous offre les outils nécessaires pour le faire de manière efficace et fiable.

En suivant les bonnes pratiques et en choisissant la méthode adaptée à votre cas d'utilisation, vous pouvez tirer parti de la puissance du hasard en Ruby pour créer des applications dynamiques, imprévisibles et sécurisées. Testez les exemples fournis et consultez la documentation de Ruby pour mieux comprendre ses capacités en matière de génération de nombres aléatoires.

À Carmatec, nos experts Ruby on Rails tirent parti de ces fonctionnalités pour développer des applications évolutives, sécurisées et hautement performantes. De solutions destinées aux entreprises En ce qui concerne les API personnalisées, nous veillons à ce que les techniques de randomisation appropriées soient mises en œuvre afin de renforcer la sécurité, les performances et la fiabilité, permettant ainsi aux entreprises d'innover en toute confiance.