SORU
23 Aralık 2014, Salı


Neden bu rastgele değer 50/50 yerine 25/75 bir dağıtım var mı?

Düzenleme:Yazmaya çalışıyorum ne yani temelde double 1 bit bir karma.

50/50 şans ile true false double bir harita istiyorum. Bunun için rastgele bir sayı alır kod yazdım(sadece bir örnek, sorun ları ile veri üzerinde bu kullanmak ve hala 50/50 bir sonuç elde etmek istiyorum)eğer 0 ise 1 , veya n ise son bit kontrol eder ve artırır y.

Ancak, bu kod sürekli 25% y 75% n olur. Neden 50/50 değil mi? Ve neden garip, ama düz ileri (1/3) böyle bir dağıtım?

public class DoubleToBoolean {
    @Test
    public void test() {

        int y = 0;
        int n = 0;
        Random r = new Random();
        for (int i = 0; i < 1000000; i  ) {
            double randomValue = r.nextDouble();
            long lastBit = Double.doubleToLongBits(randomValue) & 1;
            if (lastBit == 1) {
                y  ;
            } else {
                n  ;
            }
        }
        System.out.println(y   " "   n);
    }
}

Örnek çıktı:

250167 749833

CEVAP
23 Aralık 2014, Salı


Bu gibi nextDouble çalışıyor çünkü: (source)

public double nextDouble()
{
    return (((long) next(26) << 27)   next(27)) / (double) (1L << 53);
}

next(x) x rasgele bit yapar.

Şimdi neden bu kadar önemli? Çünkü yaklaşık yarım sayılar ürettiği ilk bölüm (Önceki bölüm) daha az 1L << 52, ve bu nedenle onların significand değil tamamen dolgu 53 bit bu olabilir dolgu, yani en az önemli bit significand her zaman sıfır.


Dikkat miktarı nedeniyle bu burada Java double (ve diğer birçok dilde) gerçekten neye benzediğini fazladan açıklama ve bu soru neden önemli alma.

Temelde, bir double bu gibi görünüyor: (source)

double layout

Çok önemli bir ayrıntı değil görünür bu resimde sayı olan"". normalleştirilmiş ^sup>153 bit kesir 1 (üs kadar böyle seçerek), 1 ile başlayan bu tür sonra atlandı. Bu resmi kısmı için 52 bit (significand) gösterir neden ama etkili 53 bit vardır.

Normalleşmesi anlamına gelir eğer kodu için nextDouble 53 bit set, bit örtülü önde gelen 1 ve uzağa gidiyor, ve diğer 52 bit kopyalanır kelimenin tam anlamıyla için significand sonuç double. Eğer bu bit ancak ayarlanmışsa, kalan bit set olur gidene kadar kaymış olmalı.

Ortalama olarak, yarısı oluşan rakamlar, significand durumda girerdeğilkaymış sol (yarım olanlar var 0 olarak onların en az önemli bit), ve diğer yarısı kaymıştır tarafından en az 1 (veya sadece tamamen sıfır) yani onların en az önemli bit her zaman 0.

1: Her zaman değil, açık bir şekilde hayır en yüksek olan sıfır, bunu zaman 1 olamaz. Bu sayılar denormal veya normalin altında sayılar wikipedia:denormal number denir.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Cartoonium

    Cartoonium

    11 NİSAN 2011
  • Facebook Developers

    Facebook Dev

    24 ŞUBAT 2009
  • Vortez

    Vortez

    27 Temmuz 2009