JavaScript'te belirli bir aralıkta rastgele tam sayılar oluşturma?

JavaScript'te belirtilen iki değişken arasında rastgele tam sayıları nasıl oluşturabilirim, örneğin x = 4 ve y = 8, 4, 5, 6, 7, 8den herhangi birini çıkarır?

Çözüm

Mozilla Geliştirici Ağı]1 sayfasında bazı örnekler bulunmaktadır:

/**
 * Returns a random number between min (inclusive) and max (exclusive)
 */
function getRandomArbitrary(min, max) {
    return Math.random() * (max - min) + min;
}

/**
 * Returns a random integer between min (inclusive) and max (inclusive).
 * The value is no lower than min (or the next integer greater than min
 * if min isn't an integer) and no greater than max (or the next integer
 * lower than max if max isn't an integer).
 * Using Math.round() will give you a non-uniform distribution!
 */
function getRandomInt(min, max) {
    min = Math.ceil(min);
    max = Math.floor(max);
    return Math.floor(Math.random() * (max - min + 1)) + min;
}

Bunun arkasındaki mantık şu. Bu basit bir üç kuralı:

Math.random()0 (dahil) ile 1 (hariç) arasında birSayı` döndürür. Yani şöyle bir aralığımız var:

[0 .................................... 1)

Şimdi, min (dahil) ve maks (hariç) arasında bir sayı istiyoruz:

[0 .................................... 1)
[min .................................. max)

Karşılığı [min, max) aralığında almak için Math.random kullanabiliriz. Ancak, önce ikinci aralıktan mini çıkararak problemi biraz çarpanlarına ayırmalıyız:

[0 .................................... 1)
[min - min ............................ max - min)

Bu verir:

[0 .................................... 1)
[0 .................................... max - min)

Şimdi `Math.random' uygulayabilir ve ardından karşılık gelen değeri hesaplayabiliriz. Rastgele bir sayı seçelim:

                Math.random()
                    |
[0 .................................... 1)
[0 .................................... max - min)
                    |
                    x (what we need)

Yani, x değerini bulmak için şunu yapmalıyız:

x = Math.random() * (max - min);

Min`i geri eklemeyi unutmayın, böylece [min, max) aralığında bir sayı elde ederiz:

x = Math.random() * (max - min) + min;

Bu MDN'nin ilk işleviydi. İkincisi, her ikisi de dahil olmak üzere min ve maks arasında bir tamsayı döndürür.

Şimdi tamsayıları almak için round, ceil veya floor kullanabilirsiniz.

Math.round(Math.random() * (max - min)) + minkullanabilirsiniz, ancak bu eşit olmayan bir dağılım verir. Hemminhem demaks` sadece yaklaşık olarak yarı yarıya atma şansına sahiptir:

min...min+0.5...min+1...min+1.5   ...    max-0.5....max
└───┬───┘└────────┬───────┘└───── ... ─────┘└───┬──┘   ← Math.round()
   min          min+1                          max

Maxaralıktan çıkarıldığında,min`den daha az atma şansı vardır.

Math.floor(Math.random() * (max - min +1)) + min` ile tamamen eşit bir dağılıma sahip olursunuz.

min.... min+1... min+2 ... max-1... max.... max+1 (is excluded from interval)
|        |        |         |        |        |
└───┬───┘└───┬───┘└─── ... ┘└───┬───┘└───┬───┘   ← Math.floor()
   min     min+1               max-1    max

Bu denklemde ceil() ve -1 kullanamazsınız çünkü maxın artık biraz daha az atma şansı vardır, ancak (istenmeyen) min-1 sonucunu da atabilirsiniz.

Yorumlar (29)
function getRandomizer(bottom, top) {
    return function() {
        return Math.floor( Math.random() * ( 1 + top - bottom ) ) + bottom;
    }
}

kullanım:


var rollDie = getRandomizer( 1, 6 );

var results = ""
for ( var i = 0; i
Yorumlar (7)
function getRandomInt(lower, upper)
{
    //to create an even sample distribution
    return Math.floor(lower + (Math.random() * (upper - lower + 1)));

    //to produce an uneven sample distribution
    //return Math.round(lower + (Math.random() * (upper - lower)));

    //to exclude the max value from the possible values
    //return Math.floor(lower + (Math.random() * (upper - lower)));
}

Bu işlevi ve bu işlevin varyasyonlarını test etmek için aşağıdaki HTML/JavaScript'i bir dosyaya kaydedin ve bir tarayıcı ile açın. Kod, bir milyon fonksiyon çağrısının dağılımını gösteren bir grafik üretecektir. Kod ayrıca uç durumları da kaydedecektir, böylece fonksiyon maksimumdan büyük veya minimumdan küçük bir değer üretirse, bundan.haberiniz.olacaktır.




        <script type="text/javascript">
        function getRandomInt(lower, upper)
        {
            //to create an even sample distribution
            return Math.floor(lower + (Math.random() * (upper - lower + 1)));

            //to produce an uneven sample distribution
            //return Math.round(lower + (Math.random() * (upper - lower)));

            //to exclude the max value from the possible values
            //return Math.floor(lower + (Math.random() * (upper - lower)));
        }

        var min = -5;
        var max = 5;

        var array = new Array();

        for(var i = 0; i 
Yorumlar (0)