2012-05-22 7 views

cevap

15

Boost. üniforma dağılımlar için sahip bu bir:

http://www.boost.org/doc/libs/1_49_0/doc/html/boost/random/uniform_real_distribution.html

DÜZENLEME: yeni C++ 11 uygulanmasını içerecek şekilde güncellendi. Basit bir örnek olacağını

http://en.cppreference.com/w/cpp/numeric/random/uniform_int_distribution

: tamsayılar durumunda için, burada referansı olan

#include <random> 
#include <iostream> 
int main() 
{ 
    std::random_device rd; 
    std::mt19937 gen(rd()); 
    std::uniform_int_distribution<> dis(1, 6); 
    for(int n=0; n<10; ++n) 
     std::cout << dis(gen) << ' '; 
    std::cout << '\n'; 
} 
+5

Ve ** bunlar şimdi ** C++ 11 bir parçasıdır standarttır. –

+0

@ K-ballo bu harika! C++ 11 C++ çok daha kolay hale getiriyor :) – betabandido

+1

Belki de küçük bir kod örneği yararlı olabilir. – authchir

10

C sözde rasgele sayılar oluşturmak için ++, çok iyi bir seçenek kullanıyor Mersenne twister yalancı rasgele sayı üreteci motor: <random> başlığından std::mt19937.

Biz bu motorun düşünebilirizyüksek kaliteli rasgele bit tükürür bir karakutu olarak.

Daha sonra, bu rastgele bit bir dağılımı kullanarak bazı tamsayı çıkış şeklinde olabilir; özellikle, sözde rastgele sayılar için eşit şekilde dağıtılmak üzere std::uniform_int_distribution kullanılabilir.

Motor nesnesinin numaralı tohum ile başlatılması gerektiğini unutmayın. Bu amaç için
std::random_device kullanılabilir.

Yani, bu süreç üç mantıksal adımda özetlenebilir:

  1. Mersenne Twister motoru için olmayan deterministik tohum almak için, std::random_device bir örneğini oluşturun.
  2. Yüksek kaliteli sözde rasgele bit almak için std::mt19937altyapısı örneğini oluşturun.
  3. eşit dağıtılmış tam sayı bir std::uniform_int_distribution şekil bu rasgele bit kullanın.

Derlenebilir C++ kod aşağıdaki gibidir: (rand()değil iyidir nedenlerinden dahil) C sözde rasgele sayılar üreten hakkında daha fazla ayrıntı ++ için

#include <iostream>  // for console output 
#include <random>  // for pseudo-random number generators and distributions 

int main() 
{ 
    // Use random_device to generate a seed for Mersenne twister engine. 
    std::random_device rd;  

    // Use Mersenne twister engine to generate pseudo-random numbers. 
    std::mt19937 engine(rd()); 

    // "Filter" MT engine's output to generate pseudo-random integer values, 
    // **uniformly distributed** on the closed interval [0, 99]. 
    // (Note that the range is [inclusive, inclusive].) 
    std::uniform_int_distribution<int> dist(0, 99); 

    // Generate and print 10 pseudo-random integers 
    for (int i = 0; i < 10; ++i) 
    { 
     std::cout << dist(engine) << ' '; 
    } 
    std::cout << std::endl; 
} 

, Stephan tarafından bu videoyu görmek T. Lavavej (from Going Native 2013):

rand() Considered Harmful

+0

+1 Kesin bir süre aldı ama bu sonuçta birleştirildi. Sorunuzu, birleştirme ve OP'nin yorumunun bir parçası olduğunu ve bu yeni cevabın neden eski bir tarihle atıldığını anladığını belirtmek için düzenlemek isteyebilirsiniz. –

+0

Herkesin neden Mersenne Twister'ın çok iyi ve "yüksek kaliteli" olduğunu söylediğini bilmiyorum. Değil. Bu karmaşık, büyük bir bellek ayak izi var ve hala TestU01 BigCrush test paketinin birden çok testini başarısız. Günümüzde yeterli periyotlarla birkaç basit, hızlı ve çok daha kaliteli PRNG vardır. – plasmacel

+0

@plasmacel: Stephan T. Lavavej'e (VC STL'nin bakıcısı) sordum ve en iyi standart PRNG'yi doğruladı. Daha iyi alternatifler olarak ne önerirsiniz? –

0

std::generate_n ve boost kullanılarak bir ya da tam sayı alanı üzerinde muntazam dağılımı ile rastgele değişkenlerin belirtilen sayıda oluşturmak için:

#include <iostream> 
#include <algorithm> 
#include <boost/random.hpp> 

/* 
* 
*/ 
int main(int argc, char** argv) { 
    boost::mt19937 rand_generator(std::time(NULL)); 
    boost::random::uniform_int_distribution<> int_distribution(0, 100); 

    //Need to pass generator 
    std::cout << int_distribution(rand_generator) << std::endl; 

    //Associate generator with distribution 
    boost::random::variate_generator<boost::mt19937&, 
      boost::random::uniform_int_distribution<> 
      > int_variate_generator(rand_generator, int_distribution); 

    //No longer need to pass generator 
    std::cout << int_variate_generator() << std::endl; 
    std::generate_n(std::ostream_iterator<int>(std::cout, ","), 3, int_variate_generator); 
    return 0; 
} 
İlgili konular