Orijinal kaynak (tohum * 9301 + 49297)% 233280` rasgele algoritma?


9

Tohumlanmış (sözde) bir Rastgele sayı üreteci oluşturma örneklerini ararsanız, bunun gibi şeylerle karşılaşırsınız (belirli örnek http://indiegamr.com/generate-repeatable-random-numbers-in-js/ ):

// the initial seed
Math.seed = 6;

// in order to work 'Math.seed' must NOT be undefined,
// so in any case, you HAVE to provide a Math.seed
Math.seededRandom = function(max, min) {
    max = max || 1;
    min = min || 0;

    Math.seed = (Math.seed * 9301 + 49297) % 233280;
    var rnd = Math.seed / 233280;

    return min + rnd * (max - min);
}

Bu belirli sayılar (9301, 49297, 233280) ve algoritma defalarca kullanılır, ancak hiç kimse bunun için kesin bir referansa sahip görünmemektedir. Bu algoritmayı kim icat etti ve dağıtımı test etti? Alıntı yapılacak bir kağıt ya da bir şey var mı?


5
Bir var doğrusal uyumlu jeneratör ama oldukça küçük dönemle (sadece 233k 32 bitlik int bir 4 milyar dönemi var sağlarken
mandal ucube

1
İnsanlar genellikle doğrudan kitaplardan kod kopyalar, bu yüzden muhtemelen bir yerdeki eski bir kitaptan kopyalanır ve birkaç kez kopyalanır. Aynı zamanda sınırlayıcı bir durum gibi görünmektedir. Olası yararlı: heydari.persiangig.com/Ebooks/Applied_Crypto-Ch11-ch20.pdf/… ict.griffith.edu.au/anthony/info/C/RandomNumbers
barrycarter 27:14

2
Kökeni ne olursa olsun, bunlar bir tohumun hesaplanmasında kullanılacak korkunç değerlerdir.

3
@jlarson bir yorum neredeyse yeterince uzun değil, ancak iki sorun var. İlk olarak, mandal ucube olarak belirtildiği gibi, modulo maksimum süredir: jeneratör kendini tekrar etmeden önce benzersiz sayıların sayısı. Gerçek süre daha küçük olabilir. İkincisi, daha uzun bir süre sağlamak için diğer iki sayı (çoğunlukla çoğul bant) modulo sayısına nispeten asal olmalıdır . İdeal olarak modulo numarası, veri tipine uyan maksimum pozitif tamsayıdan daha büyük asal sayıdır ve diğer iki sayı da büyük primlerdir.

1
Bu, bu bir yan tartışma olduğu ve gerçek bir cevap eklemek bu soru için uygun olmadığından, bu sayıların neden korkunç olduğunun kısa, kısa versiyonudur. Daha fazla bilgi için Wikipedia ve belki de Matematik veya Bilgisayar Bilimi etrafında sıçramanızı öneriyorum , ancak teknik olarak yalancı sayı algoritmaları da Programcılar'da konuyla ilgili.

Yanıtlar:


7

Google Kitaplar'da hızlı bir arama yapılması, bu numaraların (9301, 49297, 233280) bir dizi referansta kullanıldığını gösterir:

  • FORTRAN 77'deki Sayısal Tarifler
  • C ++ 'da Sayısal Metotlara Giriş
  • CGI Geliştiricisinin Kaynağı: TCL ve PERL'de Web Programlama
  • Mühendisler ve Bilim Adamları için Etkili Fortran 77
  • JavaScript geliştirme
  • Hepsi C
  • Kısaca Java Örnekleri
  • Seminer algoritmaları
  • Mekaniğe Giriş

En eskisi, 1977'nin George Elmer Forsythe, Michael A. Malcolm, Cleve B. Moler (Prentice-Hall) tarafından matematiksel hesaplamalar için Bilgisayar yöntemleri , ancak Google metnin kitapta nerede kullanıldığını göstermediğinden doğrulanamıyor.

Metni en erken gösteren Pascal (İlk Baskı) Sayısal Tarifler: Bilimsel Hesaplama Sanatı, Baskı tarafından Cilt 1 , Teukolsky, Vetterling ve Flannery tam bir "Taşınabilir Rastgele Sayı Jeneratörleri için Sabitler" tablosunda. Bu belirli sayılar 2 ^ 31'de bir taşma ile verilir.

Sayısal Tarifler kitapların serisi derece popülerdir ve 1986 yılından bu yana baskı olmuştur.


1
Vay, cevap burada değilse, nerede olacağını bilmiyorum. Teşekkürler .. // Bu sayıların neden özel olduğuna dair bazı özel araştırmalara işaret edebilmeyi umuyordum, ancak bu yeterli. 9301 iki asalın ürünüdür (71x131), 49297 asaldır - içgüdüsel olarak bunun alakalı olması gerektiğini hissediyorum. 233280 asal değil - 2x2x2x2x2x2x3x3x3x3x3x3x5 (veya 2 ^ 6 * 3 ^ 5 * 5)
jlarson
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.