Notez que cette approche est plus biaisée et moins efficace qu'une nextInt
approche, https://stackoverflow.com/a/738651/360211
Un modèle standard pour y parvenir est:
Min + (int)(Math.random() * ((Max - Min) + 1))
La fonction de bibliothèque Java Math Math.random () génère une valeur double dans la plage [0,1)
. Notez que cette plage n'inclut pas le 1.
Pour obtenir d'abord une plage de valeurs spécifique, vous devez multiplier par l'ampleur de la plage de valeurs que vous souhaitez couvrir.
Math.random() * ( Max - Min )
Cela renvoie une valeur dans la plage [0,Max-Min)
, où «Max-Min» n'est pas inclus.
Par exemple, si vous le souhaitez [5,10)
, vous devez couvrir cinq valeurs entières pour utiliser
Math.random() * 5
Cela retournerait une valeur dans la plage [0,5)
, où 5 n'est pas inclus.
Vous devez maintenant déplacer cette plage jusqu'à la plage que vous ciblez. Pour ce faire, ajoutez la valeur Min.
Min + (Math.random() * (Max - Min))
Vous obtiendrez maintenant une valeur dans la plage [Min,Max)
. Suivant notre exemple, cela signifie [5,10)
:
5 + (Math.random() * (10 - 5))
Mais cela n'inclut toujours pas Max
et vous obtenez une valeur double. Pour obtenir la Max
valeur incluse, vous devez ajouter 1 à votre paramètre de plage (Max - Min)
, puis tronquer la partie décimale en effectuant un transtypage en entier. Cela se fait via:
Min + (int)(Math.random() * ((Max - Min) + 1))
Et voila. Une valeur entière aléatoire dans la plage [Min,Max]
, ou selon l'exemple [5,10]
:
5 + (int)(Math.random() * ((10 - 5) + 1))