0
votes

Comment retourner une valeur aléatoire dans une plage, à partir d'une carte avec Integer et Liste of Longs en Java

J'essaie de trouver un moyen d'obtenir une valeur aléatoire à partir d'une liste fournie de différentes gammes utilisant threadlocalrandom et renvoie une valeur aléatoire d'une méthode. J'ai essayé différentes approches et n'avons pas beaucoup de chance.

J'ai essayé ceci: xxx

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 mappe , j'ai essayé de créer une carte des entiers et de la liste des longs: xxx

Je ne sais pas comment stocker ces gammes de valeur dans le Map.

J'ai essayé d'ajouter des valeurs, par exemple: xxx

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

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 threadlocalrandom.current (). Nextlong (origine, lié) où l'origine serait 233L et la liaison serait 333l, puis retourne une valeur aléatoire dans cette plage de 233L-333L.

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é!


3 commentaires

Y a-t-il toujours seulement deux éléments de la liste représentant la gamme? Si oui, n'auriez pas origine = longs [0] et limité = long [1] ?


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é


3 Réponses :


1
votes
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. 

1 commentaires

Dang, merci! Puis-je alors revenir à RandomValue d'une méthode?



1
votes

C'est assez simple. Votre long [] [] va bien.

Tout d'abord, sélectionnez un index aléatoire, puis sélectionnez une longueur longue entre les valeurs [index] [0] et et et valeurs [index] [1] 1 . xxx

bien sûr, vous pouvez aussi Abstrait IT Away dans certaines classes pratiques.

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).

Mise en œuvre avec une distribution même

Cependant, si vous souhaitez prendre en charge différentes gammes pendant que la distribution doit rester même, une autre approche est requis.

Nous pourrions calculer un seul numéro aléatoire à 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.

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.


1 dans mes exemples, la limite supérieure est exclusive . Ceci est cohérent avec de nombreuses méthodes à partir des bibliothèques standard Java, telles que threadlocalrandom.nextlong (origine, liée) ou longstream.range (longue démarrage, long terme) . .


4 commentaires

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!



0
votes

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);
   }


0 commentaires