SORU
6 AĞUSTOS 2013, Salı


'181783497276652981 ile s ve Rastgele 8682522807148012 (Java 7)?

Neden 181783497276652981 8682522807148012 Random.java seçilmiş?

İşte ilgili kaynak Java SE ile İLGİLENİYORUZ 1.7 kodu:

/**
 * Creates a new random number generator. This constructor sets
 * the seed of the random number generator to a value very likely
 * to be distinct from any other invocation of this constructor.
 */
public Random() {
    this(seedUniquifier() ^ System.nanoTime());
}

private static long seedUniquifier() {
    // L'Ecuyer, "Tables of Linear Congruential Generators of
    // Different Sizes and Good Lattice Structure", 1999
    for (;;) {
        long current = seedUniquifier.get();
        long next = current * 181783497276652981L;
        if (seedUniquifier.compareAndSet(current, next))
            return next;
    }
}

private static final AtomicLong seedUniquifier
    = new AtomicLong(8682522807148012L);

Yani, herhangi bir parametre olmadan tohum new Random() yürütmesini geçerli" ve System.nanoTime() ile XORs. "tohum uniquifier alır 181783497276652981 new Random() denir, Bir sonraki sefer için depolanmak üzere başka bir tohum uniquifier oluşturmak için kullanır.

Harfleri 181783497276652981L 8682522807148012L sabitler yer değildir, ama başka bir yerde görünmüyor.

İlk Yorum bana kolay bir yol sağlar. Bu yazı için arama online the actual article verir. 8682522807148012 kağıt görünmüyor, ama 181783497276652981 1 e 181783497276652981 başka bir sayı bir dize, 1181783497276652981 şeklinde görünür.

Kağıt 1181783497276652981 veren bir numarası olduğunu iddia ediyor iyi "liyakat" doğrusal congruential jeneratör için. Bu numara sadece yanlış kopyalanan Java kullanıyordu. 181783497276652981 kabul edilebilir bir değeri var mı?

Ve neden 8682522807148012 seçildi?

Her iki sayı için çevrimiçi arama hiçbir açıklama verir, ayrıca eleştiriler o this page 181783497276652981 önünde 1 düştü sadece.

Diğer sayılar da bu iki sayı olarak çalışan seçilmiş olabilir mi? Neden ya da neden değil?

CEVAP
7 AĞUSTOS 2013, ÇARŞAMBA


  1. Bu numara sadece yanlış kopyalanan Java kullanıyordu.

    Evet, bir yazım hatası gibi görünüyor.

  2. 181783497276652981 kabul edilebilir bir değeri var mı?

    Bu değerlendirme algoritması gazetede sundu kullanarak tespit edilebilir. Ama liyakat "özgün" sayı muhtemelen daha yüksek.

  3. Ve neden 8682522807148012 seçildi?

    Rastgele gibi görünüyor. Sistemin sonucu olabilir.kod yazıldıktan sonra. () nanoTime

  4. Diğer sayılar da bu iki sayı olarak çalışan seçilmiş olabilir mi?

    Her sayının eşit olur"". Bu yüzden, hayır.

Tohum Stratejileri

Farklı versiyonları ve TOTEM uygulaması arasında varsayılan-Ekim şemasında farklılıklar vardır.

public Random() { this(System.currentTimeMillis()); }
public Random() { this(  seedUniquifier   System.nanoTime()); }
public Random() { this(seedUniquifier() ^ System.nanoTime()); }

Birincisi, eğer bir satırda birden fazla RNGs oluşturursanız kabul edilebilir değildir. Eğer oluşturma süreleri aynı milisaniye aralığında düşerse, tamamen aynı sıraları verecektir. (aynı tohum =>aynı sıra)

İkinci bir iş parçacığı güvenli değil. Birden çok iş parçacığı aynı anda başlatırken aynı RNGs alabilirsiniz. Ayrıca, sonraki başlatmaları tohumlar ilişkili olma eğilimindedir. Sistemin gerçek zamanlayıcı çözünürlük bağlı olarak, tohum sırası doğrusal (n, n 1, n 2,...) artmasına neden olur. How different do random seeds need to be? ve başvurulan gazetede belirtildiği gibi Common defects in initialization of pseudorandom number generators ilişkili tohumlar birden fazla RNGs gerçek dizileri arasında korelasyon oluşturabilir.

Üçüncü yaklaşım, rasgele dağıtılmış ve böylece aralarında tohumlar, hatta iş parçacığı ve sonraki başlatmaları karşısında oluşturur. Geçerli java docs:

Bu yapıcı bir rasgele sayı tohum jeneratör setleri bu değer herhangi bir diğer çağırma farklı olması çok muhtemel kurucu.

genişletilmiş olabilir "konuları arasında" ve "" . birbiri ile alakasız

Tohum Sıra Kalite

Ama Ekim sırası rastgele yatan o bölgede de yapalım o kadar iyi. O bölgede de yapalım bu java uygulaması tohum sırası için kullanılan bir çarpma doğrusal congruential jeneratör (MLCG) c=0 ve=2^64 m olarak kullanır. (Modül 2^64 örtülü olarak 64 bit taşma tarafından verilen uzun tamsayı) Sıfır c ve güç-2-modül nedeniyle, "kaliteli" (döngü uzunluğu, bit-korelasyon, ...) sınırlıdır. Gazete, genel çevrim ayrıca uzunluğu da dediği gibi, her daha az önemli bit için katlanarak azalır kendi döngüsü bir uzunluğu vardır. Böylece, daha düşük bit daha küçük tekrar bir desen var. (SeedUniquifier sonucu (gerçek) o bölgede de yapalım 48-bit) için kesiliyor önce bit-ters olmalıdır

Ama hızlı! Ve gereksiz karşılaştırma ve set-döngüler önlemek için, döngü vücut hızlı olmalıdır. Bu muhtemelen bu özel MLCG kullanımı, sadece bir çarpma yazılmış bir oyun programı olmadan ilavesi olmadan açıklıyor.

Ve belirtilen kağıt hediye iyi bir liste "çarpan" c=0 ve=2^64, 1181783497276652981 olarak m.

Tüm bunlar için çaba @ TOTEM-geliştiriciler ;) Ama bir yazım hatası var. (Ama kim bilir, birileri değerlendirir sürece, eksik lider 1 Ekim aslında o bölgede de yapalım geliştiren imkanı vardır.)

Ama bazı çarpanları kesinlikle daha kötü: "1" sürekli bir dizi yol açar. "2" tek bit hareket eden bir dizi (her nasılsa)ilişkili yol açar ...

RNGs için ınter-dizisi-korelasyon-aslında (Monte Carlo) çoklu rasgele dizileri örneği ve hatta parallelized nerede Simülasyonları için geçerlidir. Böylece iyi bir tohum bir strateji için gerekli olan "bağımsız" simülasyon çalışır. Bu nedenle C 11 standart Seed Sequence üretmek için ayrı bir tohum kavramını tanıtır.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • DanceOn

    DanceOn

    6 Mayıs 2006
  • laptopmag

    laptopmag

    25 Ocak 2008
  • SelmerSaxMan

    SelmerSaxMan

    24 HAZİRAN 2006