Lehmer rastgele sayı üreteci - Lehmer random number generator

Lehmer rastgele sayı üreteci[1] (adını D. H. Lehmer ), bazen aynı zamanda Park – Miller rastgele sayı üreteci (Stephen K. Park ve Keith W. Miller'dan sonra), bir tür doğrusal eşleşik üreteç (LCG) faaliyet gösteren tamsayıların çarpan grubu modulo n. Genel formül:

modül nerede m bir asal sayı veya a asal sayının gücü çarpan a yüksek bir unsurdur çarpımsal sıralama modulo m (ör. a ilkel kök modulo n ) ve tohum X0 dır-dir coprime -e m.

Diğer isimler çarpımsal doğrusal eşleşme üreteci (MLCG)[2] ve çarpımsal eşleşme üreteci (MCG).

Ortak kullanımdaki parametreler

1988'de Park ve Miller[3] belirli parametrelere sahip bir Lehmer RNG önerdi m = 231 - 1 = 2.147.483.647 (bir Mersenne asal M31) ve a = 75 = 16.807 (ilkel bir kök modülo M31), şimdi olarak bilinir MINSTD. MINSTD daha sonra Marsaglia ve Sullivan (1993) tarafından eleştirilse de,[4][5] bugün hala kullanılıyor (özellikle CarbonLib ve C ++ 11 's minstd_rand0). Park, Miller ve Stockmeyer eleştirilere cevap verdi (1993),[6] söyleyerek:

Alanın dinamik yapısı göz önüne alındığında, uzman olmayanların hangi jeneratörü kullanacaklarına karar vermeleri zordur. "Bana anlayabileceğim, uygulayabileceğim ve taşıyabileceğim bir şey verin ... son teknoloji olması gerekmez, sadece makul derecede iyi ve verimli olduğundan emin olun." Makalemiz ve ilgili asgari standart oluşturucu bu isteğe yanıt verme girişimiydi. Beş yıl sonra, çarpanın kullanımını önermekten başka cevabımızı değiştirmeye gerek görmüyoruz a = 16807 yerine 48271.

Bu revize edilmiş sabit, C ++ 11 's minstd_rand rastgele numara üreticisi.

Sinclair ZX81 ve halefleri, Lehmer RNG'yi parametrelerle kullanıyor m = 216+1 = 65.537 (bir Fermat asal F4) ve a = 75 (ilkel bir kök modülo F4).[7] CRAY rastgele numara üreticisi RANF iki katsayıya sahip bir Lehmer RNG'dir m = 248 ve a = 44,485,709,377,909.[8] GNU Bilimsel Kütüphanesi MINSTD, RANF ve rezil olanlar dahil olmak üzere Lehmer formunun birkaç rastgele sayı oluşturucusunu içerir IBM rastgele numara üreticisi RANDU.[8]

Modül seçimi

En yaygın olarak, modül bir asal sayı olarak seçilir ve bir eş asal tohum seçimini önemsiz hale getirir (herhangi bir 0 < X0 < m yapacağım). Bu, en iyi kalitede çıktı üretir, ancak bir miktar uygulama karmaşıklığı getirir ve çıktı aralığının istenen uygulama ile eşleşmesi olası değildir; istenen aralığa dönüştürmek ek bir çarpma gerektirir.

Bir modül kullanarak m hangisi bir ikinin gücü özellikle uygun bir bilgisayar uygulaması sağlar, ancak bir bedeli vardır: dönem en fazla m/ 4 ve düşük bitlerin periyotları bundan daha kısadır. Bunun nedeni düşük k bitler bir modulo-2 oluştururk kendi başlarına jeneratör; yüksek dereceli bitler asla düşük dereceli bitleri etkilemez.[9] Değerler Xben her zaman tuhaftır (bit 0 hiçbir zaman değişmez), 2 ve 1 bitleri dönüşümlüdür (düşük 3 bit 2'lik bir periyot ile tekrar eder), düşük 4 bit 4'lük bir periyot ile tekrar eder ve bu böyle devam eder. Bu nedenle, bu rastgele sayıları kullanan uygulama zorunlu en önemli bitleri kullanın; Çift modüllü bir modulo işlemi kullanarak daha küçük bir aralığa düşürmek feci sonuçlar doğuracaktır.[10]

Bu döneme ulaşmak için çarpanın karşılanması gerekir a ≡ ± 3 (mod 8)[11] ve tohum X0 tuhaf olmalı.

Kompozit modül kullanmak mümkündür, ancak jeneratör zorunlu bir değer ortaklığı ile tohumlanmak mveya dönem büyük ölçüde azalacaktır. Örneğin, bir modül F5 = 232Çıktılar kolayca 32 bitlik bir kelime ile eşleştirilebildiğinden +1 çekici görünebilir 0 ≤ Xben−1 < 232. Ancak, bir tohum X0 = 6700417 (2'yi böler32+1) veya herhangi bir çarpan, yalnızca 640 periyotlu bir çıktıya yol açar.

Büyük dönemler için daha popüler bir uygulama, birleşik doğrusal eşleşik jeneratör; Birkaç üreteci birleştirmek (örneğin çıktılarını toplayarak) modülü bileşen üreteçlerinin modülünün çarpımı olan tek bir üretecin çıktısına eşdeğerdir.[12] ve kimin periyodu en küçük ortak Kat bileşen dönemlerinin. Dönemler paylaşacak olsa da ortak bölen 2'de, modül seçilebilir, böylece tek ortak bölen ve sonuç periyodu (m1−1)(m2−1)(m2···(mk−1)/2k−1.[2]:744 Buna bir örnek, Wichmann – Hill jeneratör.

LCG ile İlişki

Lehmer RNG, belirli bir durum olarak görülebilir. doğrusal eşleşik üreteç ile c=0, belirli kısıtlamaları ve özellikleri ifade eden özel bir durumdur. Özellikle Lehmer RNG için ilk tohum X0 olmalıdır coprime modüle m bu genel olarak LCG'ler için gerekli değildir. Modülün seçimi m ve çarpan a Lehmer RNG için de daha kısıtlayıcıdır. LCG'nin aksine, Lehmer RNG'nin maksimum süresi eşittir m−1 ve böyle ne zaman m asal ve a ilkel bir kök modulodur m.

Öte yandan, ayrık logaritmalar (tabanına a veya herhangi bir ilkel kök modulo m) nın-nin Xk içinde doğrusal bir eşzamanlı diziyi temsil eder. Euler totient .

Uygulama

Bir birincil modül, çift genişlikli bir ürünün hesaplanmasını ve açık bir azaltma adımını gerektirir. 2'nin gücünden biraz daha küçük bir modül kullanılırsa ( Mersenne asalları 231−1 ve 261−1 popüler ve 232−5 ve 264−59), indirgeme modülü m = 2ed kimlik kullanılarak genel bir çift genişlikli bölmeden daha ucuza uygulanabilir 2ed (mod m).

Temel indirgeme adımı ürünü ikiye ayırır e-bit parçalar, yüksek kısmı ile çarpar. dve onları ekler: (balta mod 2e) + d ⌊balta/2e. Bunu çıkarma işlemi takip edebilir m sonuç aralık içinde olana kadar. Çıkarma sayısı sınırlıdır reklam/m, eğer kolayca bir tane ile sınırlandırılabilir d küçük ve a < m/d seçilmiş. (Bu durum aynı zamanda d ⌊balta/2e⌋ tek genişlikli bir üründür; ihlal edilirse, çift genişlikli bir ürün hesaplanmalıdır.)

Modülüs bir Mersenne üssü olduğunda (d = 1), prosedür özellikle basittir. Sadece çarpma değil d önemsiz, ama şartlı çıkarma, koşulsuz bir kaydırma ve ekleme ile değiştirilebilir. Bunu görmek için, algoritmanın şunları garanti ettiğini unutmayın: x ≢ 0 (mod m)yani x = 0 ve x =m ikisi de imkansızdır. Bu, eşdeğer olma ihtiyacını ortadan kaldırır e- devletin bit temsilleri; yalnızca yüksek bitlerin sıfır olmadığı değerler azaltmaya ihtiyaç duyar.

Düşük e ürünün bitleri balta daha büyük bir değeri temsil edemez mve yüksek bitler hiçbir zaman daha büyük bir değere sahip olmayacak a−1 ≤ m − 2. Böylece, ilk indirgeme adımı en fazla bir değer üretir m+a−1 ≤ 2m−2 = 2e+1−4. Bu bir e+ 1 bitlik sayıdan daha büyük olabilir m (yani biraz olabilir e set), ancak yüksek yarı en fazla 1 ve eğer öyleyse, düşük e bitler kesinlikle daha az olacaktır m. Böylece, yüksek bit 1 veya 0 olsun, ikinci bir indirgeme adımı (yarımların eklenmesi) asla taşmayacaktır. e bit ve toplam istenen değer olacaktır.

Eğer d > 1, koşullu çıkarmadan da kaçınılabilir, ancak prosedür daha karmaşıktır. 2 gibi bir modülün temel zorluğu32−5, 1 ≡ 2 gibi değerler için yalnızca bir temsil oluşturmamızı sağlamada yatar32−4. Çözüm, geçici olarak eklemektir d böylece olası değerler aralığı d 2'ye kadare−1 ve daha büyük değerleri azalt e Asla daha az temsil oluşturmayacak şekilde bitler d. Son olarak geçici ofsetin çıkarılması istenen değeri üretir.

Kısmen azaltılmış bir değere sahip olduğumuzu varsayarak başlayın y yani 0 ≤y < 2m = 2e+1−2d. Bu durumda, tek bir ofset çıkarma adımı 0 ≤ üretecektiry = ((y+d) mod 2e) + d ⌊(y+d)/2e⌋ − dm. Bunu görmek için iki durumu düşünün:

0 ≤ y < m = 2ed
Bu durumda, y + d < 2e ve y = y < m, istediğiniz gibi.
my < 2m
Bu durumda 2e ≤ y + d < 2e+1 bir e+ 1 bitlik sayı ve ⌊ (y+d)/2e⌋ = 1. Dolayısıyla, y = (y+d) − 2e +d − dy − 2e + dy − m < m, istediğiniz gibi. Çünkü çarpılan yüksek kısım d, toplam en az d ve ofsetin çıkarılması hiçbir zaman yetersizliğe neden olmaz.

(Özellikle bir Lehmer jeneratörü durumunda, sıfır durumu veya görüntüsü y = m asla gerçekleşmeyecek, bu nedenle bir ofset d−1 daha uygunsa aynı şekilde çalışacaktır. Bu, Mersenne birincil durumunda ofseti 0'a düşürür. d = 1.)

Daha büyük bir ürünü küçültmek balta 2'den azm = 2e+1 − 2d ofset olmadan bir veya daha fazla azaltma adımı ile yapılabilir.

Eğer reklam ≤ m, o zaman ek bir azaltma adımı yeterlidir. Dan beri x < m, balta < am ≤ (a−1)2eve bir azaltma adımı bunu en fazla 2'ye dönüştürüre − 1 + (a−1)d = m + reklam - 1. Bu 2 sınır içindedirm Eğer reklam − 1 < m, bu ilk varsayımdır.

Eğer reklam > m, o zaman ilk indirgeme adımının 2'den büyük bir toplam üretmesi mümkündürm = 2e+1−2d, bu son azaltma adımı için çok büyük. (Ayrıca şununla çarpmayı gerektirir: d daha büyük bir ürün üretmek e bitler, yukarıda belirtildiği gibi.) Ancak, d2 < 2eilk indirgeme, önceki iki indirgeme aşamasının uygulanması için gereken aralıkta bir değer üretecektir.

Schrage yöntemi

Çift genişlikli bir ürün yoksa, Schrage yöntemi,[13][14] yaklaşık çarpanlara ayırma yöntemi olarak da adlandırılır,[15] hesaplamak için kullanılabilir balta mod m, ancak bunun bedeli var:

  • Modülüs bir içinde gösterilebilir olmalıdır işaretli tam sayı; aritmetik işlemler bir ± aralığına izin vermelidirm.
  • Çarpan seçimi a kısıtlanmıştır. Buna ihtiyacımız var m mod a ≤ ⌊m/a, genellikle seçerek elde edilir a ≤ m.
  • Yineleme başına bir bölüm (kalan ile) gereklidir.

Bu teknik, aşağıdaki taşınabilir uygulamalar için popülerken üst düzey diller çift ​​genişlikli işlemlerden yoksun olan,[2]:744 modern bilgisayarlarda sabit ile bölme genellikle çift genişlikli çarpma kullanılarak uygulanır, bu nedenle verimlilik önemliyse bu teknikten kaçınılmalıdır. Yüksek seviyeli dillerde bile, çarpan a Sınırlıdır m, ardından çift genişlikli ürün balta iki tek genişlikli çarpım kullanılarak hesaplanabilir ve yukarıda açıklanan teknikler kullanılarak azaltılabilir.

Schrage yöntemini kullanmak için ilk faktör m = qa + r, yani yardımcı sabitleri önceden hesaplayın r = m mod a ve q = ⌊m/a = (mr)/a. Ardından, her yinelemede hesaplama baltaa(x mod q) − r ⌊x/q⌋ (mod m).

Bu eşitlik geçerli çünkü

yani eğer biz x = (x mod q) + qx/q⌋, alırız:

Taşmamasının nedeni, her iki terimin de m. Dan beri x modq < qm/ailk terim kesinlikle daha azdır am/a = m ve tek genişlikli bir ürünle hesaplanabilir.

Eğer a öyle seçildi ki r ≤ q (ve böylece r/q ≤ 1), daha sonra ikinci terim de daha azdır m: r ⌊x/q⌋ ≤ rx/q = x(r/q) ≤ x(1) = x < m. Dolayısıyla, fark [1−mm−1] ve [0,m−1] tek bir koşullu ekleme ile.[16]

Bu teknik, olumsuz bir r (−q ≤ r <0), son indirgemeyi koşullu çıkarmaya değiştirerek.

Teknik aynı zamanda daha büyük a yinelemeli olarak uygulayarak.[15]:102 Nihai sonucu üretmek için çıkarılan iki terimden yalnızca ikincisi (r ⌊x/q⌋) taşma riski. Ancak bu, kendisi ile modüler bir çarpımdır. derleme zamanı sabiti rve aynı teknikle uygulanabilir. Çünkü ortalama olarak her adım çarpanın boyutunu yarıya indirir (0 ≤r < a, ortalama değer (a−1) / 2), bu, bit başına bir adım gerektiriyor ve olağanüstü derecede verimsiz görünüyor. Bununla birlikte, her adım aynı zamanda x sürekli artan bir bölümle q = ⌊m/ave hızlı bir şekilde bağımsız değişkenin 0 olduğu ve özyinelemenin sonlandırılabileceği bir noktaya ulaşılır.

Örnek C99 kodu

Kullanma C Park-Miller RNG kodu şu şekilde yazılabilir:

uint32_t lcg_parkmiller(uint32_t *durum){	dönüş *durum = (uint64_t)*durum * 48271 % 0x7fffffff;}

Arayan kişi durumu sıfırdan büyük ve modülden küçük herhangi bir sayıya ilklendirmeye dikkat ettiği sürece, bu işlev sözde rasgele sayılar oluşturmak için tekrar tekrar çağrılabilir. Bu uygulamada 64 bit aritmetik gereklidir; aksi takdirde, iki 32 bitlik tam sayının çarpımı taşabilir.

64 bitlik bölünmeyi önlemek için indirgemeyi elle yapın:

uint32_t lcg_parkmiller(uint32_t *durum){	uint64_t ürün = (uint64_t)*durum * 48271;	uint32_t x = (ürün & 0x7fffffff) + (ürün >> 31);	x = (x & 0x7fffffff) + (x >> 31);	dönüş *durum = x;}

Yalnızca 32 bit aritmetik kullanmak için Schrage yöntemini kullanın:

uint32_t lcg_parkmiller(uint32_t *durum){	// Schrage yöntemi için önceden hesaplanmış parametreler	sabit uint32_t M = 0x7fffffff;	sabit uint32_t Bir = 48271;	sabit uint32_t Q = M / Bir;    // 44488	sabit uint32_t R = M % Bir;    //  3399	uint32_t div = *durum / Q;	// maksimum: M / Q = A = 48.271	uint32_t rem = *durum % Q;	// maksimum: Q - 1 = 44.487	int32_t s = rem * Bir;	// maks: 44.487 * 48.271 = 2.147.431.977 = 0x7fff3629	int32_t t = div * R;	// maksimum: 48.271 * 3.399 = 164.073.129	int32_t sonuç = s - t;	Eğer (sonuç < 0)		sonuç += M;	dönüş *durum = sonuç;}

veya iki 16 × 16 bit çarpımı kullanın:

uint32_t lcg_parkmiller(uint32_t *durum){	sabit uint32_t Bir = 48271;	uint32_t düşük  = (*durum & 0x7fff) * Bir;			// maksimum: 32.767 * 48.271 = 1.581.695.857 = 0x5e46c371	uint32_t yüksek = (*durum >> 15)    * Bir;			// maks: 65,535 * 48,271 = 3,163,439,985 = 0xbc8e4371	uint32_t x = düşük + ((yüksek & 0xffff) << 15) + (yüksek >> 16);	// maks: 0x5e46c371 + 0x7fff8000 + 0xbc8e = 0xde46ffff	x = (x & 0x7fffffff) + (x >> 31);	dönüş *durum = x;}

Başka bir popüler Lehmer jeneratörü, asal modül 2'yi kullanıyor32−5:

uint32_t lcg_rand(uint32_t *durum){    dönüş *durum = (uint64_t)*durum * 279470273u % 0xfffffffb;}

Bu, 64 bitlik bir bölme olmadan da yazılabilir:

uint32_t lcg_rand(uint32_t *durum){	uint64_t ürün = (uint64_t)*durum * 279470273u;	uint32_t x;	// 5 * 279470273 = 0x5349e3c5 32 bite sığdığından gerekli değildir.	// ürün = (ürün & 0xffffffff) + 5 * (ürün >> 32);	// 0x33333333 = 858,993,459'dan büyük bir çarpan buna ihtiyaç duyar.	// Çarpma sonucu 32 bite sığar, ancak toplam 33 bit olabilir.	ürün = (ürün & 0xffffffff) + 5 * (uint32_t)(ürün >> 32);	ürün += 4;	// Bu tutarın 32 bit olacağı garanti edilir.	x = (uint32_t)ürün + 5 * (uint32_t)(ürün >> 32);	dönüş *durum = x - 4;}

Diğer birçok Lehmer jeneratörü iyi özelliklere sahiptir. Aşağıdaki modulo-2128 Lehmer üreteci, derleyiciden 128 bitlik destek gerektirir ve L'Ecuyer tarafından hesaplanan bir çarpan kullanır.[17] 2 periyodu vardır126:

statik imzasız __int128 durum;/ * Durum tek bir değerle tohumlanmalıdır. * /geçersiz tohum(imzasız __int128 tohum){	durum = tohum << 1 | 1;}uint64_t Sonraki(geçersiz){	// GCC, 128 bit değişmezler yazamaz, bu nedenle bir ifade kullanırız	sabit imzasız __int128 çoklu =		(imzasız __int128)0x12e15e35b500f16e << 64 |		0x2e714eb2b37916a5;	durum *= çoklu;	dönüş durum >> 64;}

Jeneratör tek bir 128 bitlik değeri hesaplar ve üst 64 bitini döndürür.

Bu jeneratör, BigCrush'ı TestU01, ancak TMFn testinde başarısız oldu PractRand. Bu test, bu tür bir jeneratörün kusurunu tam olarak yakalamak için tasarlandı: modül 2'nin gücü olduğundan, çıkıştaki en düşük bitin periyodu sadece 2'dir.622 yerine126. Doğrusal uyumlu jeneratörler gücü 2 modülü ile benzer davranışa sahiptir.

Aşağıdaki çekirdek rutin, tamsayı iş yükleri için yukarıdaki kodun hızını geliştirir (eğer sabit bildirimin derleyici tarafından bir hesaplama döngüsünden optimize edilmesine izin verilirse):

uint64_t Sonraki(geçersiz){	uint64_t sonuç = durum >> 64;	// GCC, 128 bit değişmezler yazamaz, bu yüzden bir ifade kullanıyoruz	sabit imzasız __int128 çoklu =		(imzasız __int128)0x12e15e35b500f16e << 64 |		0x2e714eb2b37916a5;	durum *= çoklu;	dönüş sonuç;}

Bununla birlikte, çarpma ertelendiğinden, ilk çağrı basitçe çekirdek durumunun üst 64 bitini döndürdüğü için karma oluşturma için uygun değildir.

Referanslar

  1. ^ W.H. Payne; J.R. Rabung; T.P. Bogyo (1969). "Lehmer sözde rasgele sayı üretecini kodlama" (PDF). ACM'nin iletişimi. 12 (2): 85–86. doi:10.1145/362848.362860.
  2. ^ a b c L'Ecuyer, Pierre (Haziran 1988). "Etkin ve Taşınabilir Kombine Rastgele Sayı Üreteçleri" (PDF). [ACM'nin İletişimi]. 31 (6): 742–774. doi:10.1145/62959.62969.
  3. ^ Park, Stephen K .; Miller, Keith W. (1988). "Rastgele Sayı Üreteçleri: İyi Olanları Bulmak Zor" (PDF). ACM'nin iletişimi. 31 (10): 1192–1201. doi:10.1145/63039.63042.
  4. ^ Marsaglia, George (1993). "Teknik yazışma: Rastgele Sayı Üreteçlerinin Seçilmesi ve Uygulanmasına İlişkin Açıklamalar" (PDF). ACM'nin iletişimi. 36 (7): 105–108. doi:10.1145/159544.376068.
  5. ^ Sullivan, Stephen (1993). "Teknik yazışma: Bir başka rastgelelik testi" (PDF). ACM'nin iletişimi. 36 (7): 108. doi:10.1145/159544.376068.
  6. ^ Park, Stephen K .; Miller, Keith W .; Stockmeyer, Paul K. (1988). "Teknik Yazışma: Yanıt" (PDF). ACM'nin iletişimi. 36 (7): 108–110. doi:10.1145/159544.376068.
  7. ^ Vickers, Steve (1981). "Bölüm 5 - İşlevler". ZX81 Temel Programlama (2. baskı). Sinclair Araştırma Ltd. ZX81, p = 65537 & a = 75 [...] kullanır(ZX81 kılavuzunun, 65537'nin 2'ye eşit bir Mersenne asalı olduğunu yanlış bir şekilde belirttiğini unutmayın.16−1. ZX Spectrum kılavuzu bunu düzeltti ve 2'ye eşit bir Fermat asal olduğunu doğru bir şekilde belirtir16+1.)
  8. ^ a b GNU Bilimsel Kitaplığı: Diğer rasgele sayı üreteçleri
  9. ^ Knuth, Donald (1981). Seminümerik Algoritmalar. Bilgisayar Programlama Sanatı. 2 (2. baskı). Okuma, MA: Addison-Wesley Professional. sayfa 12–14.
  10. ^ Bique, Stephen; Rosenberg, Robert (Mayıs 2009). Cray XD1'de MPI ve OpenMP Kullanarak Yüksek Kaliteli Sözde Rasgele Sayılar ve Permütasyonların Hızlı Üretimi. Cray Kullanıcı Grubu 2009. Kalıp, modüler aritmetik kullanılarak belirlenir, örn. lrand48 ()% 6 + 1,... CRAY RANF işlevi, olası altı sonuçtan yalnızca üçünü döndürür (üç taraf tohuma bağlıdır)!
  11. ^ Greenberger, Martin (Nisan 1961). "Yeni Sözde Rastgele Sayı Üreticisi Üzerine Notlar". ACM Dergisi. 8 (2): 163–167. doi:10.1145/321062.321065.
  12. ^ L'Ecuyer, Pierre; Tezuka, Shu (Ekim 1991). "İki Sınıf Birleşik Rastgele Sayı Üreteci için Yapısal Özellikler". Hesaplamanın Matematiği. 57 (196): 735–746. doi:10.2307/2938714.
  13. ^ Schrage, Linus (Haziran 1979). "Daha Taşınabilir Bir Fortran Rastgele Sayı Üreticisi" (PDF). Matematiksel Yazılımda ACM İşlemleri (TOMS). 5 (2): 132–138. CiteSeerX  10.1.1.470.6958. doi:10.1145/355826.355828.
  14. ^ Jain, Raj (9 Temmuz 2010). "Bilgisayar Sistemleri Performans Analizi Bölüm 26: Rastgele Sayı Üretimi" (PDF). s. 19–22. Alındı 2017-10-31.
  15. ^ a b L'Ecuyer, Pierre; Côté, Serge (Mart 1991). "Bölme olanaklarıyla rastgele sayı paketi uygulama". Matematiksel Yazılımda ACM İşlemleri. 17 (1): 98–111. doi:10.1145/103147.103158. Bu, bir sabit ile modüler çarpmanın birkaç farklı uygulamasını araştırır.
  16. ^ Fenerty, Paul (11 Eylül 2006). "Schrage Yöntemi". Alındı 2017-10-31.
  17. ^ L'Ecuyer, Pierre (Ocak 1999). "Farklı boyutlara ve iyi kafes yapısına sahip doğrusal uyumlu jeneratörlerin tabloları" (PDF). Hesaplamanın Matematiği. 68 (225): 249–260. CiteSeerX  10.1.1.34.1024. doi:10.1090 / s0025-5718-99-00996-5.

Dış bağlantılar