SORU
6 EKİM 2009, Salı


Belirli bir aralıktaki Javascript üreten rasgele sayı?

Nasıl, *örneğin 10* y = 8 4, 5, 6, 7, 8 herhangi bir çıktı ki Javascript belirtilen iki değişken arasında rastgele bir tam sayı oluşturabilirim?

CEVAP
6 EKİM 2009, Salı


Mozilla Developer Center sayfasında bazı örnekler var:

/**
 * 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)
 * Using Math.round() will give you a non-uniform distribution!
 */
function getRandomInt(min, max) {
    return Math.floor(Math.random() * (max - min   1))   min;
}

İşte bunun arkasındaki mantık. Üç basit kural var:

Math.random() 0 (dahil) ile 1 arasında Number (özel) verir. Böyle bir aralık var:

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

Şimdi, min (dahil) ve max arasında bir numara (özel) istiyoruz:

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

Math.random [max min) muhabiri aralığı elde etmek için kullanabiliriz. Ama, ikinci Aralık min çıkararak biraz sorun faktör gerekir: birincisi

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

Bu verir:

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

Şimdi Math.random uygulamak ve muhabiri hesaplamak olabilir. Hadi rastgele bir sayı seçin:

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

x, bulmak için çok yapardık,:

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

Bir dizi [max min) aralığı almamız min tekrar eklemeyi unutma:

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

Bu MDC gelen ilk özellik oldu. İkincisi, min max, her ikisi de dahil) arasında bir tamsayı döndürür.

Elde tamsayı için round, ceil floor kullanabilirsiniz.

Math.round(Math.random() * (max - min)) min, bu ancak olmayan eşit dağılım sağlar kullanabilirsiniz. Her ikisi de, min max sadece yaklaşık yarım rulo şansı var:

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

max aralığı dışında kalmasıyla, daha az min daha rulo için bir şans var.

Math.floor(Math.random() * (max - min 1)) min ile mükemmel şekilde eşit bir dağılım var.

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

Sen bir insan değilsin ceil() -1 bu denklem, çünkü max şimdi biraz daha az şansa rulo, ama roll (istenmeyen) min-1 sonuç çok.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Bart Baker

    Bart Baker

    1 Aralık 2006
  • Helder Barreto

    Helder Barre

    22 Mayıs 2006
  • infiniTuts

    infiniTuts

    18 Ocak 2012