Java aléatoire renvoie toujours le même nombre lorsque j'ai mis la graine?
J'ai besoin d'aide avec un générateur de nombre aléatoire je suis en train de créer. Mon code est comme suit (à l'intérieur d'une classe appelée numéros):
public int random(int i){
Random randnum = new Random();
randnum.setSeed(123456789);
return randnum.nextInt(i);
}
Lorsque j'appelle cette méthode d'une autre classe (dans le but de générer un nombre aléatoire), il renvoie toujours le même nombre. Par exemple, si je devais faire:
System.out.println(numbers.random(10));
System.out.print(numbers.random(10));
il imprime toujours le même nombre, par exemple, de 5 de 5. Que dois-je faire pour qu'il imprime deux numéros différents par exemple 5 8
Il est obligatoire que j'ai mis la graine.
Grâce
- Ne pas créer un nouvel objet Aléatoire à chaque appel de la fonction. Le garder comme une variable privée et de l'instancier qu'une seule fois
- De quoi êtes-vous le réglage de la graine?
- Réglage manuel de la graine n'est pas recommandée, sauf si vous savez exactement ce que cela signifie.
- "Toute personne qui estime arithmétique méthodes de production de chiffres aléatoires est, bien sûr, dans un état de péché"
Vous devez vous connecter pour publier un commentaire.
Vous avez besoin de partager la
Random()
exemple à travers l'ensemble de la classe:Si vous avez toujours l'ensemble de la graine, vous obtiendrez toujours la même réponse. Qu'est ce que le réglage de la graine n'.
Il y a deux problèmes à l'origine de ce que vous voyez. La première est que le code définit une valeur de départ pour une instance Aléatoire. La seconde est que la méthode d'instance "aléatoire" des instances d'un nouvel objet Aléatoire puis immédiatement ses graines avec la même graine tous les temps. La combinaison de ces deux garanties que, pour la même valeur de i, la méthode "aléatoire" renvoie toujours la même valeur et il sera toujours le premier dans la séquence de la graine génère toujours.
En supposant que le réglage de la graine est obligatoire, pour obtenir la valeur suivante dans la séquence au lieu de le même la première valeur de la séquence à chaque fois, le randnum instance de Hasard ne peut pas avoir ses graines à chaque fois juste avant sa prochaine méthode est appelée. Pour corriger cela, déplacez le randnum variable locale instance de Hasard dans le champ d'application de l'aléatoire de la méthode d'instance de la classe portée. Deuxièmement, définir la semence seulement lorsque aléatoire est attribué à une instance Aléatoire ou seulement pour obtenir le même séquence de résultats pour recommencer à nouveau. Classe Aléatoire de setSeed(longue graine) méthode d'instance ne peut pas s'exécuter dans le domaine de la classe, afin que le constructeur a à définir à l'aide de l'Aléatoire constructeur avec la longue graine paramètre. Le code suivant montre l'évolution:
Ci-dessus vous donne une solution exacte de votre problème exact, comme l'a déclaré. Cependant, l'utilisation obligatoire de la graine semble inhabituel, étant donné ce qu'il fait.
Si c'est pour un projet de classe ou d'un logiciel de test où la séquence doit être prévisible et reproductible, la définition de la graine à une valeur fixe de sens. Sinon, la question de la validité de la définition de la graine certaine valeur prédéterminée. Le tableau suivant explique plus sur le Hasard, les graines de Hasard et pourquoi il y a une disposition pour la fourniture d'une graine.
Aléatoire possède deux constructeurs:
et
et une méthode d'instance
qui affectent la séquence de nombres obtenus à partir d'une instance Aléatoire. La méthode d'instance,
définit l'objet au Hasard le même état, il aurait été s'il avait été juste instanciées avec la même graine que l'argument du constructeur. Seul le faible-de l'ordre de 48 bits d'une valeur de semences utilisées.
Si un objet Aléatoire est instanciée sans une graine, la semence sera le même que le système de temps (en millisecondes). Cela garantit que, à moins que les deux objets Aléatoires sont instanciées dans le même ordre de la milliseconde, ils produiront différents pseudo-aléatoire de séquences. Seul le bas de l'ordre de 48 bits de la valeur de départ est utilisé. Cela provoque imprévisible pseudo-aléatoire de séquences. Il n'est pas nécessaire et un gaspillage de ressources de calcul pour obtenir une nouvelle instance de l'Aléatoire à chaque fois que l'on appelle une méthode suivante.
Aléatoire des semences paramètres sont fournis pour que l'on puisse instance d'un objet Aléatoire qui produit une séquence qui est répétable. Pour une graine, la séquence de valeurs en suivant les méthodes sont garantis d'être le même ordre à chaque fois que la graine est utilisée. Ceci est utile pour tester le logiciel qui va utiliser des pseudo-aléatoire de séquences où les résultats doivent être prévisible et reproductible. Il n'est pas utile pour la création de différents imprévisible pseudo-aléatoire de séquences de fonctionnement.
L'énoncé "il est obligatoire que j'ai mis la graine" nie toute unpredictablity de l'objet Aléatoire pseudo-aléatoire de séquences. Est-ce pour un projet de classe ou d'un logiciel de test où les résultats doivent être les mêmes pour les mêmes entrées pour le programme?
Définir la graine qui, une fois au démarrage, plutôt que chaque fois que vous voulez un nouveau nombre aléatoire.
Ce que vous utilisez n'est pas un Générateur de Nombre Aléatoire, c'est un Générateur de nombres Pseudo Aléatoires. GÉNÉRATEUR de générer des séquences de nombres pseudo-aléatoires, la graine sélectionne un point de départ dans une séquence (un GÉNÉRATEUR peut générer un ou plusieurs séquences).
Avez-vous besoin nécessairement de créer le
new Random()
à l'intérieur de votrerandom(int i)
méthode? Si vous êtes OBLIGÉ de le faire de cette façon, vous pouvez utiliser, vous pouvez définir la graine à l'heure actuelle, même si ce n'est pas l'échec de la preuve, parce que vous pouvez appeler votrenumbers.random(10)
si vite après l'autre, qu'il finira par être la même graine. Vous pouvez essayer peut-être à l'aide de nanosecondes (Système d'.nanoTime (), je pense? Et si setSeed accepte uniquement de type int, multipliez, je suppose).Ce que je suggère, cependant, si vous êtes autorisé à le faire, est de déclarer votre Aléatoires à l'extérieur votre méthode. Si vous instancier votre variable aléatoire, disons, votre
number
constructeur de la classe, vous pouvez définir toutes les graines et tout le temps que vous appelez votre méthode, vous donner un nouveau numéro. (Ils seront les mêmes séries de numéros à chaque fois que vous redémarrez votre application si vous utilisez une constante de semences cependant, vous pouvez utiliser le temps que vos graines dans ce cas aussi).Enfin, le dernier problème pourrait être si vous déclarez plusieurs
number
classes en même temps. Ils ont tous le même aléatoire, et vous donner le même ensemble de nombres aléatoires. Si cela se produit, vous pouvez faire unstatic Random
dans votre classe principale, et de l'appeler dans vos numéros de classe. Cette volonté couple de ces deux classes, mais il pourrait fonctionner. Une autre option serait d'envoyer une incrémentation de la valeur à votrenumber
constructeur de la classe, pour chaquenumber
vous instancier et utiliser la valeur que vous passez à la graine de.La deuxième option devrait être bon pour vous, si vous êtes autorisé à le faire de cette façon.
Généralement, l'Aléatoire n'est pas vraiment aléatoire, mais pseudo-aléatoires. Il faut une graine et l'utilise pour générer une séquence de nombres qui ressemble au hasard (mais est entièrement contenue prévisible et il répète que si vous mettez la même graine).
Si vous ne mettez pas de graine, de la première graine seront prises à partir d'une source variable (généralement de l'heure du système).
Généralement, une valeur de semences seront utilisés afin de répéter les valeurs exactes (par exemple, pour les tests). Utilisation Aléatoire sans graines à la place.