Paralel sözde sayı üreteçleri


20

Bu soru öncelikle pratik bir yazılım mühendisliği problemiyle ilgilidir, ancak teorisyenlerin bu konuda daha fazla bilgi verebileceğini merak ediyorum.


Basitçe söylemek gerekirse, sahte bir sayı üreteci kullanan bir Monte Carlo simülasyonum var ve paralel olarak aynı simülasyonu çalıştıran 1000 bilgisayar olacak şekilde paralelleştirmek istiyorum. Bu nedenle 1000 bağımsız sahte sayı akışına ihtiyacım var.

Aşağıdaki özelliklere sahip 1000 paralel akışa sahip olabilir miyiz? Burada , her türlü hoş teorik ve ampirik özelliklere sahip, çok iyi bilinen ve yaygın olarak incelenen bir PRNG olmalıdır.X

  1. Akışlar, basitçe kullandığımda ve X tarafından üretilen akışı 1000 akışa böldüğümde elde edebileceğim kadar iyi .XX

  2. Herhangi bir akışta bir sonraki sayıyı oluşturmak (neredeyse) ile bir sonraki sayıyı oluşturmak kadar hızlıdır .X

Aksi takdirde: "ücretsiz" olarak birden fazla bağımsız yayın alabilir miyiz?

Tabii ki sadece kullandıysak , her zaman 999 sayısını atıp 1'i seçersek, kesinlikle mülk 1'e sahip olurduk, ancak çalışma süresinde faktör 1000 ile kaybederdik.X

Basit bir fikir , tohumların 1, 2, ..., 1000 olan 1000 kopyasını kullanmak olacaktır. Bu kesinlikle hızlı olurdu, ancak akışların iyi istatistiksel özelliklere sahip olup olmadığı açık değildir.X


Bazı Google'lardan sonra, örneğin aşağıdakileri buldum:

  • SPRNG kütüphane tam olarak bu amaç için tasarlanmış gibi görünüyor, ve desteklediği çoklu PRNGs .

  • Mersenne twister günümüzde popüler bir PRNG gibi görünüyor ve paralel olarak birden fazla akış üretebilen bir varyanta bazı referanslar buldum.

Ama bütün bunlar kendi araştırma alanımdan çok uzak, gerçekten en son teknolojinin ne olduğunu ve hangi yapıların sadece teoride değil pratikte de iyi çalıştığını anlayamadım.


Bazı açıklamalar: Herhangi bir şifreleme özelliğine ihtiyacım yok; bu bilimsel hesaplama içindir. Milyarlarca rastgele sayıya ihtiyacım olacak, bu yüzden periyodu olan herhangi bir jeneratörü unutabiliriz .<232

Düzenleme: Gerçek bir RNG kullanamıyorum; Deterministik bir PRNG'ye ihtiyacım var. İlk olarak, hata ayıklamada çok yardımcı olur ve her şeyi tekrarlanabilir hale getirir. İkincisi, çoklu geçiş modelini kullanabileceğimden yararlanarak, örneğin medyan bulmayı çok verimli bir şekilde yapmama izin veriyor ( bu soruya bakın ).

Edit 2: Yakından ilişkili bir soru var @ StackOverflow: Küme ortamı için sözde rasgele sayı üreteci .


6
PRNG'yi neden bağımsız örneklenmiş tohumla kullanmıyorsunuz ? Farklı makineler arasında koordinasyon gerektirmediği için bunun 1 ve 2'yi nasıl karşılamadığını anlamıyorum1000
Sasho Nikolov

Ben uzman değilim, ama son zamanlarda (bir TCS sorusu hakkında bilgi arama) Bu donanımı buldum: idquantique.com/true-random-number-generator/… ... 16Mbits / sn akış üretebilen bir PCI kartı (kuantum) rastgele bitler. ... bir grup satın alabilir ve birkaç rasgele sayı üreteci sunucuları uygulayabilirsiniz ... harika bir teorik yaklaşım değil, ancak bitlerin "iyi" olacağı garanti edilmektedir :-) :-)
Marzio De Biasi

@Vor: Her şeyi tekrarlanabilir ve kararlı tutmak istiyorum. Sabit bir tohum verildiğinde, denemeyi yeniden çalıştırırsam tam olarak aynı sonucu almak istiyorum. Aynı deneyi tek bir makinede yapabilmek ve yine aynı sonuçları elde etmek istiyorum. (Birincisi, paralel algoritmalar hata ayıklarken çok yardımcı olur ...)
Jukka Suomela

@Jukka: tamam! ... ve deney sonuçlarıyla birlikte milyarlarca çürütülemez yabani bit saklamanın o kadar da mümkün olmadığını varsayalım :-) ... bir PRNG uzmanına ihtiyaç var!
Marzio De Biasi

2
Şimdiye kadar olan cevaplar için teşekkürler! Bakalım bir ödül ile daha fazla katılım elde edersek ...
Jukka Suomela

Yanıtlar:


7

Saito ve Matsumoto tarafından geliştirilen Mersenne Twister algoritmasının evrimini kullanabilirsiniz:

SIMD odaklı Hızlı Mersenne Twister (SFMT)

SFMT, bir adımda 128 bitlik sahte tamsayı üreten Doğrusal Geri Beslemeli Kaydırma Kaydı (LFSR) üreticisidir. SFMT, çok aşamalı boru hattı ve SIMD (örn. 128 bit tamsayı) talimatları gibi modern CPU'ların son zamanlardaki paralelliğiyle tasarlanmıştır. 32 bit ve 64 bit tamsayıların yanı sıra çıktı olarak çift hassas kayan noktayı destekler. SFMT çoğu platformda MT'den çok daha hızlıdır. Sadece hız değil, aynı zamanda v-bit hassasiyetinde eşit dağılımların boyutları da geliştirildi. Ek olarak, 0-aşan başlangıç ​​durumundan kurtarma çok daha hızlıdır. Ayrıntılar için Mutsuo Saito'nun Yüksek Lisans Tezi'ne bakınız .

Süresi değişir bulundunuz 2 216.091 - 1 .2607122160911

Başlangıç ​​değerlerini değiştirerek birden fazla bağımsız akış üretmek için aynı pesudorandom sayı üretecinin kullanılması bir soruna neden olabilir (ihmal edilebilir derecede küçük olasılıkla). Sorunu önlemek için, her nesil için farklı parametreler kullanılması tercih edilir. Bu tekniğe MT parametrelerinin dinamik oluşturulması denir .

SFMT kaynak kodunda, CSV dosyasını derlenebilir bir parametre kümesine dönüştürmek için parametre kümelerinin (değişken dönemlerin) bazı örneklerini ve bir awk komut dosyasını bulabilirsiniz. " Mersenne Twister jeneratörlerinin Dinamik Oluşturulması " adlı bir araç da var .

5×107

2112131223209124449712232091244497121105031

232

Algoritma Diehard ve NIST gibi ana rastgelelik testlerini geçer.

ArXiv: Grafik İşlemcilere Uygun Mersenne Twister Varyantı Üzerine Bir Ön Makale de Kullanılabilir


Bununla ilgili ancak eski bir araç Matsumoto ve Nishimura (1998): Yalancı Sayı Üreticilerinin Dinamik Oluşturulmasıdır . Ancak, bu araçlardan hangisinin sadece bir kavram kanıtı olduğunu ve hangilerinin yaygın olarak kullanılan endüstri gücü yazılım paketleri olduğunu anlayamadım.
Jukka Suomela

@Jukka: Belki de doğrudan MTGP algoritmasının yazarlarına sorabilirsiniz. Kendi sitesinden: "... Herhangi bir geri bildirim açığız (Mutsuo Saito, saito" e-posta "işareti" math.sci.hiroshima-u.ac.jp ve m-mat "işareti" math.sci.hiroshima- u.ac.jp) ... ". Belki% 100 tarafsız olmayabilirler, ancak MTGP'nin güçlü ve zayıf noktalarını iyi bilirler ve size amaçlarınız için uygun olup olmadığını söyleyebilirler.
Marzio De Biasi

Görünüşe göre Mersenne Twister + Dinamik Oluşturma bunu Mathematica'da yapmanın önerilen yoludur.
Jukka Suomela

5×107

@Vor: Cevabınızı düzenlemek ve birlikte MTGP değiştirin dcmt , bunu kabul edebilir.
Jukka Suomela

12

xi+1=xi2 mod NNxixi+k=xi2k mod N=xi2k mod λ(N)mod NkO(log(N)3)Myxi+1,y=xi2Mmod λ(N) mod Nx0,y=x02y mod λ(N) mod Nx0

MN2M mod λ(N)


1
Her makinenin dizinin bitişik bir bölümünü üretmesine izin vermek, kesişmeyecekleri kadar birbirinden ayırmak daha hızlı olacağını düşünüyorum. Her neyse, Blum Blum Shub'ı kriptografik olmayan uygulamalar için kullanmak bana biraz fazlalık gibi geliyor.
Antonio Valerio Miceli-Barone

1
@Antonio: Evet, özellikle tam olarak kaç denemeye ihtiyacınız olduğunu biliyorsanız, bu biraz daha hızlı olacaktır. Bilmiyorsanız, her iki şekilde de aynı ölçeklendirmeyi alacaksınız. Wierdly Blum Blum Shub, yıllar önce hesaplama fiziğinde öğretildiğimiz PRNG idi. Şifreleme amacıyla kullanmıyorsanız çok daha küçük bir modül kullanabilirsiniz, bu yüzden gerçekten o kadar yavaş değildir ve birçok görev için hesaplamanız gereken rastgele değişkenin herhangi bir işlevine kıyasla hızlı olacaktır.
Joe Fitzsimons

5

snX1000ns1,s2,,s10001i1000sin

X

siiX

Xs1i<j1000sisjs


Bu @Antonio'nun önerdiği yaklaşımla aynı değil midir: kendisi için tohum üretmek için bir PRNG kullanın. Bu konuda biraz tedirgin hissediyorum ... Neyin yanlış gidebileceğine dair önemsiz bir örnek vermek için, çıktı = iç durum ve tohumun sadece iç durumu ayarladığı bir PRNG'yi düşünün.
Jukka Suomela

@Jukka: Yaklaşımım Antonio'nunkine benziyor, ama benimki daha genel. Örneğinizdeki PRNG (output = dahili durum) kriptografik olarak güvenli görünmüyor. Bir PRNG, eğer çıkışı tekdüze dağılımdan hesaplanamazsa kriptografik olarak güvenlidir. Bkz bu daha fazla bilgi için. Not: Blum-Blum-Shub PRNG bu durumu karşılar.
MS Dousti

2

fM=1000{0,1,,M1}jif(i+jM)M

Bu size her işlemde bir kriptografik RNG verecektir, ancak mutlaka bir performans maliyeti ile birlikte gelmez. AES, onu destekleyen bir donanımınız varsa hızlıdır ve ChaCha ne olursa olsun hızlıdır. Elbette, emin olmak için bunu kendi ayarınızda ölçmek isteyeceksiniz.

f


Ben yoksa değil mesela etkin şifreleme, nasıl ChaCha (sayaç) ile karşılaştırıldığında nasıl, Mersenne Twister umurunda? Daha hızlı mı yoksa daha yavaş mı? En azından iyi istatistiksel özelliklere sahip mi? Google'ı kullanmaya çalıştım, ancak bu ikisini kriptografik olmayan bir bağlamda karşılaştıran herhangi bir makale bulamadım.
Jukka Suomela

2

Artık SFMT (hızlı Mersenne Twister uygulaması) için bir atlama fonksiyonu var .

Bu, 1000 MT'leri başlatmamı sağlar, böylece döngü çakışması olmaz. Ve SFMT, MTGP'den daha hızlı olmalıdır. Amacım için neredeyse mükemmel.


1

Farklı tohumlarla başlatılmış 1000 Mersenne Twister örneğini kullanabilirsiniz.

Tohumları başka bir Mersenne Twister'dan veya bağımsızlıklarından emin olmak için OS kriptografik sözde sayı üreticisinden (Linux'ta / dev / urandom) örnekleyebilirsiniz.

Mersenne Twister her zaman aynı döngüsel dizide çalışır, tohum onu ​​üretmeye başladığınız yeri kontrol eder. Bağımsız olarak örneklenmiş tohumlarla, her jeneratör çok küçük bir kavşak olasılığı ile farklı, tipik olarak çok uzak noktalardan başlayacaktır.


Yani MT başka bir MT ile MT tohumlama mantıklı garanti bazı güzel özel özelliklere sahip?
Jukka Suomela

MT kanıtlanabilir herhangi bir sahte özellik var mı?
Sasho Nikolov

@Jukka: farkında olduğum biri değil. Bu nedenle, bazı garip bilinmeyen korelasyonlardan özellikle korkuyorsanız, tohumlama için başka bir PRNG türü kullanmanızı önerdim.
Antonio Valerio Miceli-Barone

@Sasho: Wikipedia sayfası k-dağılımından ve büyük dönemden bahsediyor.
Antonio Valerio Miceli-Barone

1
kk
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.