Ben gibi İçinde c 40 diğer sayfalara ++ hakkında, malzeme üzerindeki tüm kırmızı bu izlediler Stephan T. Lavavej "STL" video
ve hala anlamaya Tam bir Pazar aldı kadar emin nasıl rasgele sayılar eserler praksisinde değildi ne hakkında ve nasıl çalışır ve kullanılabilir.
Bence STL "artık srand kullanmamak" konusunda haklı ve video 2'de iyi açıkladı . Ayrıca şunları kullanmanızı önerir:
a) void random_device_uniform()
- şifreli nesil için ancak daha yavaş (örneğimden)
b) ile örnekler mt19937
- daha hızlı, şifrelenmemiş tohum oluşturma yeteneği
Eriştiğim tüm iddia edilen c ++ 11 kitaplarını çıkardım ve Breymann (2015) gibi Alman Yazarların hala bir klon kullandıklarını gördüm
srand( time( 0 ) );
srand( static_cast<unsigned int>(time(nullptr))); or
srand( static_cast<unsigned int>(time(NULL))); or
sadece #includings <random>
yerine <time> and <cstdlib>
- bu yüzden sadece bir kitaptan öğrenmeye dikkat edin :).
Anlamı - c ++ 11'den beri kullanılmamalıdır çünkü:
Programlar genellikle rastgele sayılar kaynağına ihtiyaç duyar. Yeni standarttan önce, hem C hem de C ++, rand adlı basit bir C kitaplığı işlevine dayanıyordu. Bu işlev, 0 aralığında, en az 32767 olan sisteme bağlı bir maksimum değere eşit olarak dağıtılan psödondom tamsayıları üretir. Rand işlevinin çeşitli sorunları vardır: Çoğu olmasa da, programların çoğundan farklı bir aralıkta rasgele sayılar gerekir biri rand. Bazı uygulamalar rastgele kayan nokta sayıları gerektirir. Bazı programlar, düzgün olmayan bir dağılımı yansıtan sayılara ihtiyaç duyar. Programcılar genellikle rand tarafından üretilen sayıların aralığını, türünü veya dağılımını dönüştürmeye çalıştıklarında rasgele olmamaya başlarlar. (Lippmans C ++ primer beşinci baskı 2012'den alıntı)
Sonunda Bjarne Stroustrups'un yeni kitaplarındaki 20 kitaptan en iyi açıklamasını buldum - ve onun eşyalarını bilmeli - "C ++ 2019 Turu", "C ++ 2016 Kullanarak Programlama Prensipleri ve Uygulamaları" ve "C ++ Programlama Dili 4. baskı" 2014 "ve" Lippmans C ++ primer beşinci baskı 2012 "deki bazı örnekler:
Ve bu gerçekten basit çünkü rastgele bir sayı üreticisi iki bölümden oluşur:
(1) rastgele veya sözde rastgele değerler dizisi üreten bir motor. (2) bu değerleri bir aralıktaki matematiksel dağılıma eşleyen bir dağılım.
Microsofts STL adamının görüşüne rağmen, Bjarne Stroustrups şöyle yazıyor:
İçinde, standart kütüphane rasgele sayı motorları ve dağılımları sağlar (§24.7). Varsayılan olarak, geniş uygulanabilirlik ve düşük maliyet için seçilen default_random_engine kullanın.
void die_roll()
Örnek Bjarne Stroustrups dan - iyi bir fikir üreten motor ve dağıtımı ile using
(daha o burada dersin) .
Burada standart kütüphane tarafından sağlanan rasgele sayı üreteçlerini pratik olarak kullanabilmek için, bazı örnekler ile bazı yürütülebilir kodlar, umarım sizin için umarım güvenli olan zaman ve paradan en aza <random>
indirgenmiştir:
#include <random> //random engine, random distribution
#include <iostream> //cout
#include <functional> //to use bind
using namespace std;
void space() //for visibility reasons if you execute the stuff
{
cout << "\n" << endl;
for (int i = 0; i < 20; ++i)
cout << "###";
cout << "\n" << endl;
}
void uniform_default()
{
// uniformly distributed from 0 to 6 inclusive
uniform_int_distribution<size_t> u (0, 6);
default_random_engine e; // generates unsigned random integers
for (size_t i = 0; i < 10; ++i)
// u uses e as a source of numbers
// each call returns a uniformly distributed value in the specified range
cout << u(e) << " ";
}
void random_device_uniform()
{
space();
cout << "random device & uniform_int_distribution" << endl;
random_device engn;
uniform_int_distribution<size_t> dist(1, 6);
for (int i=0; i<10; ++i)
cout << dist(engn) << ' ';
}
void die_roll()
{
space();
cout << "default_random_engine and Uniform_int_distribution" << endl;
using my_engine = default_random_engine;
using my_distribution = uniform_int_distribution<size_t>;
my_engine rd {};
my_distribution one_to_six {1, 6};
auto die = bind(one_to_six,rd); // the default engine for (int i = 0; i<10; ++i)
for (int i = 0; i <10; ++i)
cout << die() << ' ';
}
void uniform_default_int()
{
space();
cout << "uniform default int" << endl;
default_random_engine engn;
uniform_int_distribution<size_t> dist(1, 6);
for (int i = 0; i<10; ++i)
cout << dist(engn) << ' ';
}
void mersenne_twister_engine_seed()
{
space();
cout << "mersenne twister engine with seed 1234" << endl;
//mt19937 dist (1234); //for 32 bit systems
mt19937_64 dist (1234); //for 64 bit systems
for (int i = 0; i<10; ++i)
cout << dist() << ' ';
}
void random_seed_mt19937_2()
{
space();
cout << "mersenne twister split up in two with seed 1234" << endl;
mt19937 dist(1234);
mt19937 engn(dist);
for (int i = 0; i < 10; ++i)
cout << dist() << ' ';
cout << endl;
for (int j = 0; j < 10; ++j)
cout << engn() << ' ';
}
int main()
{
uniform_default();
random_device_uniform();
die_roll();
random_device_uniform();
mersenne_twister_engine_seed();
random_seed_mt19937_2();
return 0;
}
Sanırım her şeyi ekliyor ve dediğim gibi, bu örneklere onu okumanız bir sürü okuma ve zaman aldı - eğer sayı üretimi hakkında daha fazla şey varsa, pm veya yorum bölümünde bunu duymaktan mutluluk duyuyorum gerekiyorsa ekleyecek veya bu yayını düzenleyecektir. Bool