Générer de façon aléatoire un nombre double d'une certaine gamme en Java
J'ai vu des posts qui explique assez bien à cette question, mais ils ont tous utilisé des valeurs entières et honnêtement, je ne comprends entièrement, d'où cette question:
Je suis en train de générer des nombres aléatoires à partir de la plage (-1554900.101) à (52952058699.3098) en java, et je me demandais si quelqu'un pourrait-il m'expliquer cela que j'ai vraiment envie de comprendre.
Mes pensées:
sera-ce une bonne solution?
1) Générer un nombre entier aléatoire dans ma plage spécifiée
2) Diviser le nombre généré par pi pour obtenir float/double des résultats aléatoires
Merci à l'avance.
J'ai vraiment envie de connaître les raisons de ces limites précises 🙂
Avec Java 7, il est plus simple de répondre ici stackoverflow.com/a/32808589/1743880.
Avec Java 7, il est plus simple de répondre ici stackoverflow.com/a/32808589/1743880.
OriginalL'auteur isaiah | 2012-03-15
Vous devez vous connecter pour publier un commentaire.
Voilà l'idée. Vous voulez un nombre aléatoire dans un gamme, disons
[-1.1,2.2]
, à commencer par un exemple simple. Cette plage a une longueur de 3,3 depuis2.2 - (-1.1) = 3.3
. Maintenant, la plupart des "aléatoire" fonctions renvoient un nombre dans la plage de[0,1)
, qui a de la longueur, de sorte que nous avons à échelle notre nombre aléatoire dans notre gamme désirée.Maintenant, au hasard de notre numéro de l'importance que nous voulons, mais nous devons passer dans le numéro de ligne entre les valeurs exactes que nous voulons. Pour cette étape, nous avons juste besoin d'ajouter de la borne inférieure de l'ensemble de la gamme de notre échelle de nombres aléatoires et nous y sommes!
Alors maintenant, nous pouvons mettre ces pièces ensemble dans une seule fonction:
Bien sûr, cette fonction a besoin de certains vérification des erreurs pour des valeurs inattendues comme
NaN
mais cette réponse doit illustrer l'idée générale.Double.MAX_VALUE
vsDouble.MIN_VALUE
, ne serait pas de la ligne 3 dans le dernier extrait de sortir de la plage?OriginalL'auteur maerics
int
àdouble
types...OriginalL'auteur highlycaffeinated
Ce pas comment j'allais le faire.
Ici vous allez. Vous avez un nombre aléatoire entre la basse et la limite haute.
OriginalL'auteur JB Nizet
Il devrait être quelque chose comme:
La
+ 1
équilibre pour le fait que la plage est[0;1[
de sorte que la limite supérieure de la fourchette est exclue.Nous essayons d'abord de trouver un "integer" (très long) et nous ajouter 1 à la balance le fait que le dernier numéro est exclue, pour
529520586993098L + 15549001010L + 1
, puis on multiplie parrnd
, jette àlong
et soustraire15549001010L
déplacement de retour et à la fin de le diviser par10000.0
de le faire dans le droit de "plage".C'est sans doute plus clair:
OriginalL'auteur xanatos
Aléatoire.nextDouble renvoie un double de l'intervalle [0, 1[ donc l'utiliser, multipliez votre taille de la plage (52952058699.3098 + 1554900.101) et en décalage alors la suite (soustraire 1554900.101) pour obtenir votre numéro.
Pas sûr de la façon exacte, vous avez besoin de ce bien, sans en faire une analyse plus approfondie, vous pourriez obtenir des numéros de l'extérieur de votre gamme en raison de la façon dont les doubles sont traitées.
OriginalL'auteur Roger Lindsjö