162 votes

Java: au hasard le numéro de long en 0 <= x < n gamme

Hasard de classe a une méthode pour générer de l'aléatoire int dans une plage donnée. Par exemple:

Random r = new Random(); 
int x = r.nextInt(100);

Cela permettrait de générer un int nombre plus ou égal à 0 et inférieur à 100. Je voudrais faire exactement la même chose avec le numéro de long.

long y = magicRandomLongGenerator(100);

Hasard de classe a uniquement nextLong(), mais il ne permet pas de la plage définie.

185voto

KennyTM Points 232647

Selon http://java.sun.com/j2se/1.5.0/docs/api/java/util/Random.html nextInt est mis en œuvre comme

 public int nextInt(int n) {
     if (n<=0)
                throw new IllegalArgumentException("n must be positive");

     if ((n & -n) == n)  // i.e., n is a power of 2
         return (int)((n * (long)next(31)) >> 31);

     int bits, val;
     do {
         bits = next(31);
         val = bits % n;
     } while(bits - val + (n-1) < 0);
     return val;
 }

Donc, nous pouvons modifier la présente pour effectuer nextLong:

long nextLong(Random rng, long n) {
   // error checking and 2^x checking removed for simplicity.
   long bits, val;
   do {
      bits = (rng.nextLong() << 1) >>> 1;
      val = bits % n;
   } while (bits-val+(n-1) < 0L);
   return val;
}

76voto

M. Jessup Points 4588

La méthode standard pour générer un nombre (sans une méthode utilitaire) dans une plage est juste d'utiliser le double de la gamme:

long range = 1234567L;
Random r = new Random()
long number = (long)(r.nextDouble()*range);

vous donnera une longue entre 0 (inclus) et la plage (exclusif). De même, si vous voulez un nombre compris entre x et y:

long x = 1234567L;
long y = 23456789L;
Random r = new Random()
long number = x+((long)(r.nextDouble()*(y-x)));

vous donnera une longue de 1234567 (inclus) par 123456789 (exclusif)

Remarque: vérifiez parenthèses, parce que la coulée de long a une plus grande priorité que la multiplication.

12voto

mawaldne Points 1122

Les méthodes ci-dessus fonctionne parfaitement. Si vous utilisez apache commons (org.apache.commons.les mathématiques.aléatoire) découvrez RandomData. Il a une méthode: nextLong(long bas, de long en haut)

http://commons.apache.org/math/userguide/random.html

http://commons.apache.org/math/api-1.1/org/apache/commons/math/random/RandomData.html#nextLong(long,%20long)

11voto

Septic Overflow Points 51

Utiliser le '%' opérateur

resultingNumber = (r.nextLong() % (maximum - minimum)) + minimum;

En utilisant le '%' opérateur, nous prenons le reste quand divisé par votre valeur maximale. Ce qui nous laisse avec seulement un nombre compris entre 0 (inclus) au diviseur (exclusif).

Par exemple:

public long randLong(long min, long max) {
    return (new java.util.Random().nextLong() % (max - min)) + min;
}

2voto

Cece Points 31

Merci beaucoup pour ce post. C'est juste ce dont j'avais besoin. Devais changer quelque chose pour obtenir la partie que j'ai l'habitude de travailler.

J'ai eu la suivante (inclus ci-dessus):

long number = x+((long)r.nextDouble()*(y-x));

de travail par:

long number = x+ (long)(r.nextDouble()*(y-x));

depuis (long)r.nextDouble() est toujours à zéro.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X