J'essaie de trouver un moyen d'obtenir une valeur aléatoire à partir d'une liste fournie de différentes gammes utilisant J'ai essayé ceci: p> mais je ne pouvais pas comprendre comment obtenir une valeur aléatoire hors de celle-ci pour une plage spécifique, alors pensais que j'essayais d'essayer L'approche Je ne sais pas comment stocker ces gammes de valeur dans le Map. P> J'ai essayé d'ajouter des valeurs, par exemple: p> Je ne sais pas comment ajouter le 333L à la liste, j'ai recherché et essayé diverses choses, mais toujours obtenir des erreurs, telles que: trouvé "long", liste requise p> Je veux que l'intégrité de la carte soit un ID pour la plage associée, par exemple 1 pour 233L- 333L, de sorte que je puisse le dire d'abord, obtenez une clé Int aléatoire de la carte, par exemple 1, puis utilisez Je ne suis pas sûr que cela soit possible, ou je suis simplement approche de cela dans le mauvais sens - Toute directive CE / Aide est apprécié! P> P> threadlocalrandom code> et renvoie une valeur aléatoire d'une méthode. J'ai essayé différentes approches et n'avons pas beaucoup de chance.
mappe code>, j'ai essayé de créer une carte des entiers et de la liste des longs: p>
threadlocalrandom.current (). Nextlong (origine, lié) code> où l'origine serait 233L et la liaison serait 333l, puis retourne une valeur aléatoire dans cette plage de 233L-333L. P>
3 Réponses :
int range = ThreadLocalRandom.current().nextInt(3); long randomValue = ThreadLocalRandom.current().nextLong(values[range][0],values[range][1]); this will work with the array solution you tried first. first you select the range then you get the random value.
Dang, merci! Puis-je alors revenir à RandomValue d'une méthode?
C'est assez simple. Votre Tout d'abord, sélectionnez un index aléatoire, puis sélectionnez une longueur longue entre les valeurs bien sûr, vous pouvez aussi Notez que, pour la répartition des valeurs, toutes les gammes doivent avoir la même chose taille (qui semblent être le cas dans votre code). P> Cependant, si vous souhaitez prendre en charge différentes gammes pendant que la distribution doit rester même, une autre approche est requis. p> Nous pourrions calculer un seul numéro aléatoire em> à la limite supérieure du nombre total de valeurs possibles. Ensuite, nous pourrions vérifier dans quel «godet» la valeur doit être récupérée. P> Voici un exemple de travail . Afin de tester la distribution qui est dit même, un nombre aléatoire est généré un million de fois. Comme vous pouvez le constater, chaque valeur survient d'environ 200 000 fois. P> 1 dans mes exemples, la limite supérieure est exclusive em>. Ceci est cohérent avec de nombreuses méthodes à partir des bibliothèques standard Java, telles que long [] [] code> va bien.
[index] [0] code> et
et
et
valeurs [index] [1] code> 1 sup>. p>
Mise en œuvre avec une distribution même H3>
threadlocalrandom.nextlong (origine, liée) code> ou
longstream.range (longue démarrage, long terme) CODE>. SUP>. SUP > p> p>
Ahh, ça a du sens! Merci! Et je pourrais avoir tout cela dans une méthode, et dans cet exemple, la méthode reviendrait à RND?
Exactement. Vous pouvez également mettre ce code dans une classe commode. (Voir le lien en poste.)
Mais rappelez-vous: à moins que toutes les gammes ne soient égales de taille, cela ne fournira pas une distribution même sur toutes les valeurs, comme l'a déjà mentionné JB Nizet.
Wow, c'est génial - je l'apprécie vraiment! Très clair. Merci beaucoup!
Le plus facile est l'avant le plus simple.
private static final long[][] values = { { 233L, 333L }, { 377L, 477L }, { 610L, 710L } }; public static void main(String[] args) { for (long v[] : values) { long low = v[0]; long high = v[1]; System.out.println("Between " + low + " and " + high + " -> " + getRandom(low, high)); } } public static long getRandom(long low, long high) { // add 1 to high to make range inclusive return ThreadLocalRandom.current().nextLong(low, high + 1); }
Y a-t-il toujours seulement deux éléments de la liste représentant la gamme? Si oui, n'auriez pas
origine = longs [0] code> et
limité = long [1] code>?
Oui c'est possible. Pourquoi ne le donnes-tu pas un essai? Notez cependant que si vos gammes n'ont pas la même taille, cela ne vous donnera pas une distribution uniforme sur tous les chiffres. Notez également qu'un tableau si une carte était fondamentalement, les indices sont les clés suivantes: valeurs [0] équivaut à mapvalues.get (0)
Merci! J'ai essayé, je pense que mon problème principal est que je ne peux tout simplement pas comprendre comment ajouter les valeurs dans la carte - édité la question de la clarté