sahip noktası bir
seed_seq
entropi arttırmaktır
oluşturulan dizi. O rastgele cihazdan birden sayılarla başlatılıyor, sisteminizde bir random_device varsa tartışmasız o yapabilir. I rastgelelik bir artış, yani üretilen dizi entropi olduğunu düşünüyorum olmayan bir yalancı rasgele sayı üreteci bir sistemde. sistem rastgele cihazı yoksa
std::random_device r;
// std::seed_seq ssq{r()};
// and then passing it to the engine does the same
default_random_engine eng{r()};
uniform_real_distribution<double> urd(0, 1);
cout << "Uniform [0, 1): " << urd(eng);
o zaman kullanabilirsiniz: Sistem daha sonra rastgele bir cihaz temin yaparsa
bu gibi kullanabilirsiniz: yaklaşımınız bu konuda Bina
random_engine
default_random_engine eng{static_cast<long unsigned int>(time(0))};
uniform_real_distribution<double> urd(0, 1);
cout << "Uniform [0, 1): " << urd(eng);
bir tohum olarak time(0)
Eğer rastgelelik birden kaynağınız varsa gerçekten bunu (örneğin 2)yapabilirsiniz R1, r2, farklı rasgele aygıtlardır, örneğin, r1, r2, örn. Bir ısıl gürültü veya kuantum kaynak.
karıştırıp Nihayet
std::seed_seq seed{ r1(), static_cast<long unsigned int>(time(0)) };
default_random_engine eng{seed};
uniform_real_distribution<double> urd(0, 1);
cout << "Uniform [0, 1): " << urd(eng);
maç olabilir Tabii, ben bir tek astar ile başlatmak istiyorum: Eğer ikinci hassasiyet sahip time(0)
dert varsa
auto rand = std::bind(std::uniform_real_distribution<double>{0,1},
std::default_random_engine{std::random_device()()});
std::cout << "Uniform [0,1): " << rand();
sen üstesinden gelebilir bames23 below tarafından ilk belirlenmiş dönemden beri süre istenerek high_resolution_clock
ya oynayarak bu:
static_cast<long unsigned int>(std::chrono::high_resolution_clock::now().time_since_epoch().count())
ya da belki sadece kod içindeki fazla yorum eklemek Could CPU rastgelelik
long unsigned int getseed(int const K)
{
typedef std::chrono::high_resolution_clock hiclock;
auto gett= [](std::chrono::time_point<hiclock> t0)
{
auto tn = hiclock::now();
return static_cast<long unsigned int>(std::chrono::duration_cast<std::chrono::microseconds>(tn-t0).count());
};
long unsigned int diffs[10];
diffs[0] = gett(hiclock::now());
for(int i=1; i!=10; i++)
{
auto last = hiclock::now();
for(int k=K; k!=0; k--)
{
diffs[i]= gett(last);
}
}
return *std::max_element(&diffs[1],&diffs[9]);
}
Teşekkürler, g241. Default_random_engine'nin bir aramayı zamana dahil etmek üzere değiştirilmesinden sonra (0) program çıkışı deterministik değildir. – Argent
@Argent, AFAIK Windows'da rastgele bir motor yoktur, zaman (0) ikinci hassaslıkla akımı geçerli hale getirir, böylece sonraki işlemler farklı şekilde ekilebilir ve hedefinize ulaşır. İkincisi, parçalıktır. Bu cevap sorununuzu çözerse lütfen kabul edin. – g24l
Windows kesinlikle rasgele bir motora sahiptir; varsayılan, oldukça iyi rasgele sayıları üretmek için advapi32.dll çağrısını yapan RtlGenRandom kullanan rand_s() öğesini kullanır (kriptoya giden tüm yolun maliyeti olmadan). –