2013-07-26 23 views
7
rastgele sayılar C++ 11 yöntemdir

:Belirli bir rastgele dağılım ile kullanılacak rasgele sayı motoru nedir?

  1. rastgele bir sayı motoru
  2. örneğini dağıtım yoluyla rasgele dağıtım
  3. itme motoru rasgele sayılar örneğini

Sorun, rastgele sayı motorunun ve rastgele dağıtımı öğesinin türüne göre tempoldediğidir. kullandığınız hmetic.

Bu iki tür aritmetiğin nasıl olması gerekir?

Eğer dağıtım ve zıt için motoru için 32 bitlik tamsayı ve 64 bit tamsayı kullanabilir miyim? Tehlikeler nelerdir? Kayan nokta türleri nedir?

Bir motor tarafından üretilen olası sayıların, almayı umulan farklı rastgele sayıların sayısından daha büyük veya eşit olması gerektiğine dair bir kılavuz varsayım. Ne yazık ki, hipotezimi test edemedim, çünkü bilgisayarımda uint_fast32_t ve uint_fast64_t aynı ve dolayısıyla her iki C++ 11 jeneratörünün her biri için önerilen motorlar aynı sonuçları veriyor.

std::uniform_real_distribution veya std::uniform_int_distribution gibi C++ 11 dağıtımlarında belgeler bu konuda eksik:

Bu bölüm eksiktir. Sebep: Generator

tarihinde Ama uniform_real_distribution ait exapmple gcc 4.7 uygulanması için şartlar geçerli:

template<typename _UniformRandomNumberGenerator> 
result_type 
operator()(_UniformRandomNumberGenerator& __urng, 
     const param_type& __p) 
{ 
    __detail::_Adaptor<_UniformRandomNumberGenerator, result_type> 
    __aurng(__urng); 
    return (__aurng() * (__p.b() - __p.a())) + __p.a(); 
} 

Adaptör olduğunda:

herhangi çıktısını dönüştürmek için bir adaptör sınıfı Jeneratör, belirli bir Dağıtımın girdisine girer.

"herhangi bir" güven verici geliyor, ama standarttır? Özellikle, algılanması zor olan ve dağıtımın doğruluğunu tehlikeye atabilecek gizli taşmalar konusunda endişeliyim.

+1

Gereksinimler http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf adresinde bulunabilir (sayfa 904 sonrası). Bir cevap bulamadım ama belki yapabilirsin? – Escualo

cevap

2

Herhangi bir dağıtım işlevi için herhangi bir düzgün rasgele sayı üreteci (URNG) kullanmanıza izin verilir. Dağıtım işlevinin neyin gerekli olduğunu bildiği varsayılır ve URNG'nin ne sağladığını tanımlaması gerekir, böylece dağıtım işlevi kendi ihtiyaçları için yeterli entropi talep edebilir. (Bir "motorun" bir URNG olduğunu ve görülebilirlik gibi bazı ek gereksinimlere sahip olduğunu unutmayın.)

GNU standart kütüphanesi uygulamasından söz "evrensel" adaptör sayısal olması gereken, tek tip rasgele sayı üreteci G (aslında adı çok daha uzun olduğunu, ama bu sıkıcı alacak) ve bir sonuç türü R alır yazın. G, G::min ve G::max'u tanımlayabilmeli, dönebileceği minimum ve maksimum değerleri ve bu olasılıklar arasındaki tüm değerleri eşit olasılıkla döndürmesi gerekir. Bu nedenle, G() numaralı telefona yapılan bir aramadan kaç tane rastgele rastlantının olduğunu bilmek kolaydır. Ayrıca, numeric_limits<R>'dan bize R için kaç bit gerektiğini belirteceğiz. Bu nedenle, entropi tarafından istenen entropi bölünmesi, adaptöre, R düzgün bir şekilde rasgele üretmek için G numarasını çağırması gerektiğini söyler. Bu nedenle, adaptör, bazı sonuç tipi üreten herhangi bir URNG/motoru alır ve farklı bir sonuç tipi üretecek şekilde uyarlar.