"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Pourquoi la définition de la graine dans la classe aléatoire de Java renvoie-t-elle le même nombre ?

Pourquoi la définition de la graine dans la classe aléatoire de Java renvoie-t-elle le même nombre ?

Publié le 2024-11-09
Parcourir:485

Why Does Setting the Seed in Java's Random Class Return the Same Number?

Génération de nombres aléatoires Java : pourquoi la définition de la graine renvoie-t-elle le même nombre ?

Malgré la définition de la graine de la classe Random avec une valeur spécifique, le générateur de nombres aléatoires renvoie systématiquement le même numéro. Explorons ce qui pourrait être à l'origine de ce problème.

Comprendre la classe aléatoire et l'initialisation des graines

La classe Java Random est conçue pour générer des nombres pseudo-aléatoires. Par défaut, il utilise son horloge interne comme valeur de départ, ce qui lui permet de générer une séquence de nombres relativement prévisible. Pour personnaliser la séquence, vous pouvez définir explicitement une valeur de départ à l'aide de la méthode setSeed().

La valeur de départ est une valeur numérique utilisée pour initialiser l'état interne du générateur de nombres aléatoires. Cet état détermine la séquence de nombres générés.

Problème : partage de l'instance aléatoire

Dans le code fourni, vous créez une nouvelle instance de Random dans la méthode random(). Cela signifie que chaque fois que vous appelez random(), une nouvelle valeur de départ est définie, remplaçant ainsi la valeur de départ précédemment définie.

Pour résoudre ce problème, vous devez partager l'instance Random dans toute la classe. En créant une seule instance et en définissant la graine une fois lors de l'initialisation de la classe, vous vous assurez que la même séquence de nombres est générée de manière cohérente.

Code mis à jour

Le code mis à jour suivant résout le problème :

public class Numbers {
    private Random randnum;

    public Numbers() {
        randnum = new Random();
        randnum.setSeed(123456789);
    }

    public int random(int i) {
        return randnum.nextInt(i);
    }
}

Dans ce code mis à jour :

  1. Un champ privé appelé randnum est déclaré pour représenter l'instance Random partagée.
  2. L'instance Random est créée et la graine est défini dans le constructeur, garantissant que la graine n'est initialisée qu'une seule fois lors de la création de l'objet de classe.

En apportant ces modifications, vous obtiendrez désormais différents nombres aléatoires lors de l'appel de random() à partir de différentes parties de votre programme, tout en respectant la valeur de départ spécifiée.

Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3