Maison  >  Article  >  Java  >  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 ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-06 14:21:031009parcourir

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 graine à l'aide de la méthode setSeed().

La graine 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 le seed 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érents parties de votre programme, tout en respectant la valeur de départ spécifiée.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn