Matematik.() rastgele değeri birden büyük getiriler? | Netgez.com
SORU
8 EYLÜL 2011, PERŞEMBE


Matematik.() rastgele değeri birden büyük getiriler?

Etrafında JavaScript rastgele sayı ile oynarken şaşırtıcı bir hata, muhtemelen Google Chrome V8 JavaScript motoru keşfettim. Düşünün:

// Generate a random number [1,5].
var rand5 = function() {
  return parseInt(Math.random() * 5)   1;
};

// Return a sample distribution over MAX times.
var testRand5 = function(dist, max) {
  if (!dist) { dist = {}; }
  if (!max) { max = 5000000; }
  for (var i=0; i<max; i  ) {
    var r = rand5();
    dist[r] = (dist[r] || 0)   1;
  }
  return dist;
};

Şimdi ben çalıştırmak testRand5() aldığım aşağıdaki sonuç (tabii, biraz farklı olan her çalışma, ihtiyacın olabilir, "max" için daha yüksek bir değer ortaya çıkarmak hata):

var d = testRand5();
d = {
  1: 1002797,
  2: 998803,
  3: 999541,
  4: 1000851,
  5: 998007,
  10: 1 // XXX: Math.random() returned 4.5?!
}

İlginçtir, node.js bana özel Krom değil düşünmesine benzer sonuçlar görüyorum. Bazen farklı veya birden fazla gizem değerleri (7, 9, vb.).

Herkes sonuçları elde olabilirim niçin görüyorum? parseInt (Math.floor()) yerine kullanma ile ilgili bir şey olduğunu tahmin ediyorum ama yine de olabilirdi neden emin değilim.

CEVAP
8 EYLÜL 2011, PERŞEMBE


Kenar durum çok küçük bir sayı, bir değer ifade oluşturmak için ne zaman, örneğin bu 9.546056389808655e-8 gibi oluşur.

parseInt, ile birlikteyorumlar bir dize değişkenicehennem gevşek tatili. Ve beni daha önce de belirtildiği gibi Math.floor kullanarak çözülebilir.

Bu kod parçası ile kendiniz deneyin:

var test = 9.546056389808655e-8;

console.log(test); // prints 9.546056389808655e-8
console.log(parseInt(test)); // prints 9 - oh noes!
console.log(Math.floor(test)) // prints 0 - this is better

Bunu PaylaÅŸ:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • ★ByScrapi★ Designs

    ★ByScrapiâ

    27 AÄžUSTOS 2013
  • boburnham

    boburnham

    11 Temmuz 2006
  • MrChiCity3

    MrChiCity3

    14 NİSAN 2008