Saya merah semua hal di atas, sekitar 40 halaman lain dengan c ++ di dalamnya seperti ini dan menonton video dari Stephan T. Lavavej "STL"
dan masih tidak yakin bagaimana angka acak bekerja dalam praksis jadi saya mengambil satu hari Minggu penuh untuk mencari tahu tentang apa itu semua dan bagaimana cara kerjanya dan dapat digunakan.
Menurut saya STL benar tentang "tidak menggunakan srand lagi" dan dia menjelaskannya dengan baik di video 2 . Dia juga merekomendasikan untuk menggunakan:
a) void random_device_uniform()
- untuk generasi terenkripsi tetapi lebih lambat (dari contoh saya)
b) contoh dengan mt19937
- lebih cepat, kemampuan membuat benih, tidak terenkripsi
Saya mengeluarkan semua buku yang diklaim c ++ 11 yang dapat saya akses dan menemukan bahwa Penulis Jerman seperti Breymann (2015) masih menggunakan tiruan dari
srand( time( 0 ) );
srand( static_cast<unsigned int>(time(nullptr))); or
srand( static_cast<unsigned int>(time(NULL))); or
hanya dengan <random>
alih - alih <time> and <cstdlib>
#includings - jadi berhati-hatilah untuk belajar hanya dari satu buku :).
Artinya - itu tidak boleh digunakan sejak c ++ 11 karena:
Program seringkali membutuhkan sumber bilangan acak. Sebelum standar baru, baik C dan C ++ mengandalkan fungsi pustaka C sederhana bernama rand. Fungsi tersebut menghasilkan bilangan bulat pseudorandom yang didistribusikan secara seragam dalam rentang dari 0 hingga nilai maksimum yang bergantung pada sistem setidaknya 32767. Fungsi rand memiliki beberapa masalah: Banyak, jika tidak sebagian besar, program membutuhkan bilangan acak dalam rentang yang berbeda dari satu diproduksi oleh Rand. Beberapa aplikasi memerlukan angka floating-point acak. Beberapa program membutuhkan angka yang mencerminkan distribusi yang tidak seragam. Pemrogram sering kali memperkenalkan nonrandomness ketika mereka mencoba mengubah rentang, jenis, atau distribusi bilangan yang dihasilkan oleh rand. (kutipan dari Lippmans C ++ primer edisi kelima 2012)
Saya akhirnya menemukan penjelasan terbaik dari 20 buku di Bjarne Stroustrups yang lebih baru - dan dia seharusnya tahu barang-barangnya - di "A tour of C ++ 2019", "Programming Principles and Practice Using C ++ 2016" dan "The C ++ Programming Language 4th edition 2014 "dan juga beberapa contoh di" Lippmans C ++ primer 5th edition 2012 ":
Dan itu sangat sederhana karena generator bilangan acak terdiri dari dua bagian:
(1) mesin yang menghasilkan urutan nilai acak atau pseudo-random. (2) distribusi yang memetakan nilai-nilai tersebut ke dalam distribusi matematika dalam suatu rentang.
Terlepas dari pendapat pria STL Microsoft, Bjarne Stroustrups menulis:
Di, perpustakaan standar menyediakan mesin dan distribusi angka acak (§24.7). Secara default gunakan default_random_engine, yang dipilih untuk penerapan luas dan biaya rendah.
The void die_roll()
Contoh adalah dari Bjarne Stroustrups - ide yang baik mesin pembangkit dan distribusi dengan using
(lebih pertarungan itu di sini) .
Untuk dapat memanfaatkan secara praktis generator bilangan acak yang disediakan oleh pustaka standar di <random>
sini beberapa kode yang dapat dieksekusi dengan contoh yang berbeda direduksi menjadi yang paling tidak diperlukan yang semoga aman waktu dan uang untuk kalian:
#include <random> //random engine, random distribution
#include <iostream> //cout
#include <functional> //to use bind
using namespace std;
void space()
{
cout << "\n" << endl;
for (int i = 0; i < 20; ++i)
cout << "###";
cout << "\n" << endl;
}
void uniform_default()
{
uniform_int_distribution<size_t> u (0, 6);
default_random_engine e;
for (size_t i = 0; i < 10; ++i)
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);
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_64 dist (1234);
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;
}
Saya pikir itu menambahkan semuanya dan seperti yang saya katakan, saya butuh banyak membaca dan waktu untuk menjelaskannya pada contoh-contoh itu - jika Anda memiliki hal-hal lebih lanjut tentang pembuatan bilangan, saya senang mendengarnya melalui pm atau di bagian komentar dan akan menambahkannya jika perlu atau edit posting ini. Bool