Fortuna veya Mersenne Twister algoritmik bir RNG olarak tercih edilebilir mi?


19

Yakın tarihli bir cevap, bir Monte Carlo simülasyonunu tohumlamak için Fortuna veya Mersenne Twister Rastgele Sayı Üreticilerinin ( RNG'ler ) kullanıldığından bahsetti . Daha önce Fortuna'yı duymamıştım, bu yüzden baktım - esasen kriptografik kullanım için tasarlanmış gibi görünüyor.

Şu anda bir K-Means algoritması tohumlamak için üretim kodunda Mersenne Twister kullanıyorum.

Hangi (Fortuna veya Mersenne Twister) "algoritmik tohumlama" uygulamaları (örneğin Monte Carlo ve K-Means tohumlama) için en iyi olarak kabul edilir? Yoksa bir "atmak" - yani en uygun kullanın.

Oturduğum yerden "en iyi" en yüksek kalitede rasgele sayılar sağlamalı, hızlı çalışmalı ve (muhtemelen) düşük bellek alanına sahip olmalıdır. Bunlardan kalite muhtemelen çoğumuz için en önemlisidir.


6
Şifreleme PRNG'leri diğer çoğu PRNG'lerden çok daha yavaş olma eğilimindedir; milyonlarca PRNG operasyon numaranızın olduğu bir Monte Carlo simülasyonu yapıyorsanız, kriptografik yöntemleri çok pahalı bulacaksınız.
JM

1
@JM - Biraz daha ayrıntıyla, yorumunuzun bir cevap olarak iyi olacağını düşünüyorum. Modern donanım hızlandırmalı kripto işlevselliğinin, kriptografik olarak güvenli sahte rasgele sayıların yüksek performanslı bir akışını oluşturmak için kullanılıp kullanılamayacağına bakmak kesinlikle ilginç olacaktır.
Mark Booth

@JM kriptografik RNG'lerin yavaş olması hakkında iyi bir nokta - Fortuna'ya karşı işaret
winwaed

heres PRNG iyi bir listesi ve yararlı bulabileceğiniz birçok farklı istatistik yardımcı olur umut> boost.org/doc/libs/1_48_0/doc/html/boost_random/…
pyCthon

Cstdlib ile ilgili sorunum, ayrıntı düzeyi - yalnızca RAND_MAX=32768olası değerlerdi. Şu anda Monte Carlo raytracing sim için MT kullanıyorum. Ancak, ben yok ben ışını tarifi gibi şeylerin "rastgele" nesil yapacağım, muhtemelen benim profilcisine bir performans darboğaz olarak MT bakınız bir preprocess olarak . Örneğin, başlangıçta 100.000 ışınlık bir dizi oluşturabilir, bunları bir dizide saklayabilir ve çalışma zamanında rasgele dizi başlangıç ​​konumunu seçebilirim (koleksiyonun 10.000 ışın için çalışır). Bu, iyi rasgele sayı dağılımları yerine nispeten yüksek bir bellek yüküne sahiptir.
bobobobo

Yanıtlar:


14

Her şey bir çeşit değiş tokuş. Rasgele sayı üreteçleri için bunları 3 temel kategoriye ayırıyorum:

  1. Ödev için yeterince iyi.
  2. Şirketinize bahse girecek kadar iyi.
  3. Ülkenize bahse girecek kadar iyi.

Doğrusal uyumlu PRNG'ler (genellikle çoğu kütüphanede uygulanan yöntem) katı olarak kategori 1'de yer alır. Hem Fortuna hem de Mersenne Twister, kategori 2'de sağlamdır.

Bir karıştırma algoritmasını karıştırmanın şirketinize / kumarhanenize nasıl mal olabileceğine dair ilginç bir makale için 1999'dan bunu tavsiye ederim . Bağlantı çürümesi nedeniyle görüntüler kayboldu, ancak PRNG'den bir sonraki sayıyı oluşturulan önceki sayıya göre çizdiğiniz şekil 4, bir dizi paralel çizgi.

JM'in işaret ettiği gibi, Fortuna yavaştır. İşaret ettiğiniz gibi, Mersenne Twister oldukça hızlı.


2
Makalenin yazdırılabilir versiyonunu hızla gözden geçiren "şekil 4" resim yerine kod gibi görünüyor. "Şekil 5" kaput gibi görünüyor, ama bu WayBack Machine'den aldığım görüntü .
JM

Teşekkürler. Bu durumda hız Fortuna'ya karşı bir işaret gibi görünüyor. Yeniden. Kötü karıştırmalar: evet (örneğin, kötü bir başlangıç ​​tohumu seçerek) bir RNG'nin rastgeleliğini "geri almanın" kolay olduğunu yeterince biliyorum (fazla değil!).
winwaed

Daha iyi resimlere sahip başka bir sürüm: cigital.com/papers/download/developer_gambling.php
Tangurena

1
32 bit çıkışlı 96 bit LCG'ler Mersenne Twisters'tan daha fazla istatistiksel test geçirir. Günümüzde hiç kimse Mersenne Twister'ı kullanmamalıdır, çünkü her anlamlı açıdan MT'den çok daha iyi olan iyi kriptografik olmayan PRNG'ler yapmak çok kolaydır.
Veedrac

4

"Şifreleme" kategorisinde varsayılan seçim blum-blum-shub , bence. Vikipedi sayfasında zaten söylendiği gibi, bu simülasyonlar için uygun değildir, çünkü çok yavaştır.

Unix benzeri bir sistem üzerinde çalışıyorsanız, rasgele sayılarınızı doğrudan / dev / urandom'dan , iyi (mutlaka kripto olmasa da) kaliteli rasgele sayılar sağlayan işletim sistemi hizmeti almayı da düşünebilirsiniz . Kullandığınız belirli işletim sistemine bağlı olarak, bu Fortuna'nın bir varyantı olan Yarrow algoritmasını kullanabilir. Ancak en ilginç yönü, işletim sisteminin bazı gerçek rasgele sayılara erişmesidir: örneğin, iç sıcaklık sensörlerinden gelen termal gürültü. Tipik olarak, bu veriler, verileri tahmin edilemez tutmak için kullanılabilir olduğunda rastgele havuza karıştırılır.

Rastgele karıştırma kavramı, her iki dünyanın da en iyisini elde etmenin mümkün olabileceğini düşündürmektedir. Temel RNG'niz olarak Mersenne gibi daha hızlı, oldukça kaliteli bir rastgele sayı üreteci kullanın. İkinci, daha kaliteli rastgele sayı üretecini de koruyun - örneğin Fortuna. 25 gibi her sayı, daha iyi RNG'nin bir yinelemesini çalıştırır ve sonucu temel RNG'nizin durumuna ekler. Bu şekilde oldukça yüksek performans ve oldukça yüksek kaliteli sonuçlar elde edersiniz. (Kripto için işe yaramaz olacağını tahmin ediyorum, çünkü bu kompozit jeneratörün gücü en zayıf bağlantının gücü olabilir. Ancak, genellikle kötü niyetli bir düşmanınızın olmadığı simülasyonlar için işe yarayabilir.)


/ dev / urandom, linux ve free-bsd'de şifreleme için güvenlidir. Bu cevaba bak
Adam Kurkiewicz

Simülasyonlar için, rasgele sayıların doğru olması neden istenen bir özellik olsun ki? Elbette, bazı sahte rasgele sayı üreteçleri daha kötüdür, ancak diğerleri tüm pratik amaçlar için eşit olacaktır. Öyleyse, doğruluk neden kendi başına iyi bir özellik olarak görülüyor?
Wrzlprmft

2

Bunu yakın zamanda bir simülasyonla bu süreçten geçtiğimi söylemek istedim ve Fortuna'yı kullanmak gerçekten gerekliyse söz konusu değil. Bizim durumumuzda, MT'nin entropisinin, simülasyonumuzda bir yanlılığa dönüşecek kadar yüksek olmadığından endişeliydik. Simülasyonumuz için Fortuna'yı bu algodan yaklaşık 65 milyar rastgele sayı çekerek kullandık. Önemli olan, bilgisayarlar hızlıdır, eğer gerçekten ihtiyacınız varsa, bir nedeniniz varsa kullanabilirsiniz. Sadece monte carlo entegrasyonu gibi bir şey yapıyorsanız, MT'ye sadık kalın.


0

Cevabın, RNG'nin kullanılmasını istediğiniz uygulamaya bağlı olduğunu düşünüyorum. Tangurena'nın kaba sınıflandırması için dördüncü bir kategori öneriyorum: "Gerçek kazanç olmadan iyi".

Birçok uygulama için, önemli olmayabilir ve uygun bir şifreleme dereceli RNG, herhangi bir geçerlilikte herhangi bir orantılı kazanç olmadan görevlerinizi yavaşlatabilir. Örneğin, yaptığım araştırmaların çoğu, kabaca belirlediğim bir dağılımdan gelen çok, milyonlarca sayıya ihtiyaç duyuyor. Hemen hemen her RNG yapacak, bu yüzden ihtiyacım olan tek şey bir RNG kadar değersiz olduğu kadar felaket açısından fakir olmayan bir şey . Başka her şey işi gereksiz yere yavaşlatıyor. Mersenne Twister'ı kullanma eğilimindeyim, ancak bunun nedeni yeterince iyi çalıştığı için, kodum var ve oldukça hızlı.

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.