Java'da belirli bir aralıkta rastgele tam sayıları nasıl oluşturabilirim?

Belirli bir aralıkta rastgele bir int değeri nasıl oluşturabilirim?

Aşağıdakileri denedim, ancak bunlar işe yaramıyor:

Deneme 1:

randomNum = minimum + (int)(Math.random() * maximum);
// Bug: `randomNum` can be bigger than `maximum`.

Deneme 2:

Random rn = new Random();
int n = maximum - minimum + 1;
int i = rn.nextInt() % n;
randomNum =  minimum + i;
// Bug: `randomNum` can be smaller than `minimum`.

Java 1.7 veya sonraki sürümlerde** bunu yapmanın standart yolu aşağıdaki gibidir:

import java.util.concurrent.ThreadLocalRandom;

// nextInt is normally exclusive of the top value,
// so add 1 to make it inclusive
int randomNum = ThreadLocalRandom.current().nextInt(min, max + 1);

Bkz. ilgili JavaDoc. Bu yaklaşım, uygunsuz kullanıldığında karışıklık ve hata kaynağı olabilen java.util.Random örneğini açıkça başlatmaya ihtiyaç duymama avantajına sahiptir.

Bununla birlikte, tersine, tohumu açıkça ayarlamanın bir yolu yoktur, bu nedenle oyun durumlarını test etmek veya kaydetmek gibi yararlı olduğu durumlarda sonuçları yeniden üretmek zor olabilir. Bu gibi durumlarda, aşağıda gösterilen Java 1.7 öncesi teknik kullanılabilir.

Java 1.7'den önce, bunu yapmanın standart yolu aşağıdaki gibidir:

import java.util.Random;

/**
 * Returns a pseudo-random number between min and max, inclusive.
 * The difference between min and max can be at most
 * <code>Integer.MAX_VALUE - 1</code>.
 *
 * @param min Minimum value
 * @param max Maximum value.  Must be greater than min.
 * @return Integer between min and max, inclusive.
 * @see java.util.Random#nextInt(int)
 */
public static int randInt(int min, int max) {

    // NOTE: This will (intentionally) not run as written so that folks
    // copy-pasting have to think about how to initialize their
    // Random instance.  Initialization of the Random instance is outside
    // the main scope of the question, but some decent options are to have
    // a field that is initialized once and then re-used as needed or to
    // use ThreadLocalRandom (if using at least Java 1.7).
    // 
    // In particular, do NOT do 'Random rand = new Random()' here or you
    // will get not very good / not very random results.
    Random rand;

    // nextInt is normally exclusive of the top value,
    // so add 1 to make it inclusive
    int randomNum = rand.nextInt((max - min) + 1) + min;

    return randomNum;
}

Bkz. ilgili JavaDoc. Uygulamada, java.util.Random sınıfı genellikle java.lang.Math.random() sınıfına tercih edilir.

Özellikle, görevi yerine getirmek için standart kütüphane içinde basit bir API varken rastgele tamsayı oluşturma tekerleğini yeniden icat etmeye gerek yoktur.

Yorumlar (18)

Kullan:

minimum + rn.nextInt(maxValue - minvalue + 1)
Yorumlar (0)
 rand.nextInt((max+1) - min) + min;
Yorumlar (0)