Belirtilen aralıkta tekdüze dağıtılmış sözde rastgele tamsayılar elde etmek için bir işlev var mı? Kendi işlevimi rand
kullanarak yazabilirim, ancak bu, STL'de bunun için muhtemelen bir şey olabilecek yeterince yaygın bir durum gibi görünüyor. Rastgele sayı üretimi için birçok araç sağlar.C++ 'da düzgün şekilde dağıtılmış rastgele tamsayılar elde etmenin standart yolu nedir?
cevap
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';
}
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:
- Mersenne Twister motoru için olmayan deterministik tohum almak için,
std::random_device
bir örneğini oluşturun. - Yüksek kaliteli sözde rasgele bit almak için
std::mt19937
altyapısı örneğini oluşturun. - 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):
+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. –
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
@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? –
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;
}
- 1. C++ 'da bellek sızıntılarını kontrol etmenin en iyi yolu nedir?
- 2. Perl'de UTC ofsetini elde etmenin en iyi yolu nedir?
- 3. CUDA'da kayan noktalı özel değerler elde etmenin yolu nedir?
- 4. Film dosyalarından kapalı altyazı elde etmenin en iyi yolu nedir?
- 5. Temiz git sanal alanını elde etmenin en etkili yolu nedir?
- 6. Uzak görüntü boyutlarını elde etmenin hızlı yolu
- 7. Son eklenen satırın kimliğini elde etmenin en iyi yolu SQLite
- 8. R'nin grep sürümünde dönüşüm elde etmenin en iyi yolu?
- 9. Kalan animasyon süresini elde etmenin bir yolu var mı?
- 10. Çok boyutlu bir dizinin sağlama toplamını elde etmenin en temiz yolu nedir?
- 11. Bir EntityManager'dan tüm yönetilen varlıkları elde etmenin bir yolu var
- 12. Açıklamalarla @Outowired @Lazy @Components'ı elde etmenin en iyi yolu?
- 13. Geniş tabloyu düzgün bir şekilde gösterme yolu
- 14. Android dosyalarının düzgün şekilde silinmesi yolu
- 15. php veya javascript kullanmadan içeriğine sığacak şekilde bir textarea elde etmenin bir yolu var mı?
- 16. Programatik olarak Google arama sonucu sayısını elde etmenin en kolay (yasal) yolu nedir?
- 17. C# SQL Komut düzgün şekilde bitmedi
- 18. Çoklu değişkenlerin olup olmadığını kontrol etmenin en pythonik yolu nedir?
- 19. Firefox'ta metin alanında satır numaralarını elde etmenin en iyi yolu
- 20. Bir uyarı kutusunun kaynağını elde etmenin bir yolu var mı?
- 21. Listedeki dizeleri birleştirmenin standart yolu nedir?
- 22. C# 'da montaj açıklamasını almanın basit yolu nedir?
- 23. Qt/C++ 'da Çoklu mirasın doğru yolu nedir?
- 24. C++ 'da HTML çıktısı üretmenin en iyi yolu nedir?
- 25. Scala 2.9'da standart bir ondalık tipi nedir?
- 26. Symfony2'de dağıtım için paketlerin standart yolu nedir?
- 27. Scala'da min yığını elde etmenin en kolay ve en etkili yolu nedir?
- 28. Yii2 - Tüm benzersiz model özellik değerlerini elde etmenin en iyi yolu nedir?
- 29. Belirli bir CocoaPod sürümünü çalışma zamanında elde etmenin en iyi yolu nedir?
- 30. Groovy'deki bir Set'ten tek bir değer elde etmenin en iyi yolu nedir?
Ve ** bunlar şimdi ** C++ 11 bir parçasıdır standarttır. –
@ K-ballo bu harika! C++ 11 C++ çok daha kolay hale getiriyor :) – betabandido
Belki de küçük bir kod örneği yararlı olabilir. – authchir