1 değerden N bağımsız rasgele sayı üretecini tohumlamanın en iyi yolu


10

Programımda, her biri büyük bir veri kümesi örneklemek için kullanılan kendi RNG ile N ayrı iş parçacıkları çalıştırmak gerekir. Sonuçların çoğaltılması için tüm bu süreci tek bir değerle tohumlayabilmem gerekiyor.

Her indeks için tohumu basitçe art arda artırmak yeterli midir?

Şu anda Mersenne Twister sahte rasgele sayı üreteci kullanan numpy's kullanın RandomState.

Aşağıdaki kod pasajı:

# If a random number generator seed exists
if self.random_generator_seed:
    # Create a new random number generator for this instance based on its
    # own index
    self.random_generator_seed += instance_index
    self.random_number_generator = RandomState(self.random_generator_seed)

Esasen kullanıcı tarafından girilen bir tohumla (varsa) başlıyorum ve her örnek / iş parçacığı için sırayla çalışan örneğin dizinini (0'dan N-1'e) ekliyorum. Bunun iyi bir uygulama olup olmadığını veya bunu yapmanın daha iyi bir yolu olup olmadığını bilmiyorum.


1
Her bir iş parçacığının kaç sahte rasgele değer kullanacağını önceden biliyor musunuz - ya da en azından iyi bir üst sınır tahmini elde edebiliyor musunuz?
whuber

Hayır ben yapamam. Bir eşik değere kadar toplanan bölgeleri örnekler. Bölgelerin boyutları önemli ölçüde değişebilir.
EricR

Yanıtlar:


9

Kesinlikle harika bir uygulama değil. Örneğin, 12345 ve 12346 kök tohumlarıyla iki işlem yaptığınızda ne olacağını düşünün. Her işlemin N-1ortak akışları olacaktır .

Mersenne Twister uygulamaları ( numpy.randomve dahil random), tamsayı tohumunu MT'nin kullandığı büyük durum vektörüne (624 32 bit tamsayı) genişletmek için tipik olarak farklı bir PRNG kullanır; bu dizidir RandomState.get_state(). İstediğinizi yapmanın iyi bir yolu, giriş tamsayı ile bir kez ekilen PRNG'yi çalıştırmak ve ondan N*62432 bit tamsayı almaktır. Bu akışı Ndurum vektörlerine ayırın ve RandomState.set_state()her RandomStateörneği açıkça başlatmak için kullanın . Sen C kaynaklara başvurmayı gerekebilir numpy.randomveya _random(bunlar aynı) PRNG olduğunu almak için standart kitaplığından. Herkes Python için bu PRNG bağımsız bir sürümünü uygulamak emin değilim.


Bence bu şimdiye kadar duyduğum en iyi çözüm olabilir. Doğru olsa da akışı nasıl böldüğümün çok önemli olduğunu düşünmüyorum? İlk PRNG ve tohumdan nasıl seçildiklerine bakılmaksızın, örnekler arasında 624 32 bit tamsayılarda yinelenen bir sıraya sahip olmak çok daha olası görünmemektedir.
EricR

1
Aslında, bunu biraz geriye götüreceğim. PRNG başlatıcısının keyfi olarak ondan birçok değere sahip olacak şekilde tasarlandığı açık değildir. Durum akışını oluşturmak için başka bir kalite PRNG (tercihen MT ile ilgisiz) kullanmayı düşünün. Bir HMAC-DRBG (kriptografik bir ilkel olarak HMAC kullanan bir PRNG) sadece standart kütüphaneyi nispeten basit bir şekilde kullanarak uygulanabilir. Kriptografik güvenlik bir endişe kaynağı değildir; sadece uygulama kolaylığı ve bit akımının kalitesi. Çok nadir rastlanan bir fırsatta sıfırdan farklı vektörlerin yapılmamasını sağlamalısınız.
Robert Kern

Ya da yalnızca RandomStateayarlanabilir akışlara sahip bir algoritma kullanan geliştirme uygulamalarındaki yeni uygulamalardan birini kullanın . Yani, her RandomStateörneği aynı tohum ve farklı akış kimlikleriyle başlatırsınız (yalnızca artırılan para cezası iyidir) ve bağımsız akışların garantilenmesi sağlanır. pypi.python.org/pypi/randomstate
Robert Kern

4

Paralel işlemede kullanılan bir çözüm, rastgele jeneratörünüzü kullanmaktırΦ(u), nerede u senin tohumun mu? N-batches:

  1. üretmek Φ(u),ΦN(u),Φ2N(u),...
  2. üretmek Φ2(u),Φ1+N(u),Φ1+2N(u),...
  3. ...
  4. üretmek ΦN1(u),ΦN1+N(u),ΦN1+2N(u),...

nerede Φn(u)=Φ(Φn1(u)). Bu şekilde tek bir tohum kullanırsınız ve dizileriniz tekdüze ve bağımsızdır.


2

Şimdi bunu başarmak için yöntemleri olan RandomGen adlı bir Python paketi var.

Bu destekler tek tohum, yanı sıra MT19937 gibi eski rastgele sayı jeneratörler için bir atlama protokolünden oluşturulan bağımsız akışları.


0

Bazı insanlar, sıralı tohumlar tarafından üretilen rasgele sayılarda korelasyonlar olduğunu iddia eder. /programming/10900852/near-seeds-in-random-number-generation-may-give-slike-random-numbers Bunun ne kadar doğru olduğundan emin değilim.

Endişeleniyorsanız, neden diğer tüm jeneratörler için tohumları seçmek için tek bir rastgele sayı üreteci kullanmıyorsunuz?


Sadece 1'den fazla jeneratör için aynı tohumu rastgele üretme şansım olmasını istemediğim için. Tabii ki bunun olmasını önlemek için bazı programlama çalışmaları yapabilirdim, ancak daha sonra tohumların sırayla toplanmasından nasıl daha iyi olacağını bilmiyorum.
EricR

1
Görünüşe göre , sıralı tohumlarla korelasyonlar mümkündür ... Ancak, John D Cook'un blogundaki bu cevabın bağlantılı makalesinde gösterildiği gibi, diğer jeneratörler için tohum üretmek için bir RNG kullanmak çok daha kötü, çünkü doğum günü problemi ile karşılaşıyorsunuz! 1000 adet 16 bit imzasız tohum üretmenin rastgele% 99,95'lik bir çakışma şansına sahip olduğunu söylüyor!
Praveen
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.