Tôi tô đỏ tất cả những thứ ở trên, khoảng 40 trang khác có c ++ như thế này và xem video từ Stephan T. Lavavej "STL"
và vẫn không chắc chắn số lượng ngẫu nhiên hoạt động như thế nào trong Praxis vì vậy tôi đã dành trọn một ngày chủ nhật để tìm ra tất cả những gì về nó và làm thế nào nó hoạt động và có thể được sử dụng.
Theo tôi, STL đã đúng về việc "không sử dụng srand nữa" và anh ấy đã giải thích điều đó rất tốt trong video 2 . Ông cũng đề nghị sử dụng:
a) void random_device_uniform()
- để tạo mã hóa nhưng chậm hơn (từ ví dụ của tôi)
b) các ví dụ với mt19937
- nhanh hơn, khả năng tạo hạt giống, không được mã hóa
Tôi đã rút ra tất cả các cuốn sách c ++ 11 mà tôi có quyền truy cập và nhận thấy rằng các tác giả người Đức như Breymann (2015) vẫn sử dụng bản sao của
srand( time( 0 ) );
srand( static_cast<unsigned int>(time(nullptr))); or
srand( static_cast<unsigned int>(time(NULL))); or
chỉ với <random>
thay vì <time> and <cstdlib>
#includings - vì vậy hãy cẩn thận chỉ học từ một cuốn sách :).
Ý nghĩa - không nên được sử dụng kể từ c ++ 11 vì:
Các chương trình thường cần một nguồn số ngẫu nhiên. Trước tiêu chuẩn mới, cả C và C ++ đều dựa vào chức năng thư viện C đơn giản có tên rand. Hàm đó tạo ra các số nguyên giả được phân phối đồng đều trong phạm vi từ 0 đến giá trị tối đa phụ thuộc hệ thống ít nhất là 32767. Hàm rand có một số vấn đề: Nhiều, nếu không, hầu hết, các chương trình cần số ngẫu nhiên trong một phạm vi khác với một được sản xuất bởi rand. Một số ứng dụng yêu cầu số dấu phẩy động ngẫu nhiên. Một số chương trình cần số phản ánh phân phối không dạng. Các lập trình viên thường đưa ra sự không hợp lý khi họ cố gắng chuyển đổi phạm vi, loại hoặc phân phối các số được tạo bởi rand. (trích dẫn từ Lippmans C ++ primer phiên bản thứ năm 2012)
Cuối cùng tôi đã tìm thấy một lời giải thích tốt nhất trong số 20 cuốn sách trong Bjarne Stroustrups những cuốn mới hơn - và anh ấy nên biết nội dung của mình - trong "Chuyến tham quan C ++ 2019", "Nguyên tắc lập trình và thực hành sử dụng C ++ 2016" và "Ngôn ngữ lập trình C ++ phiên bản thứ 4 2014 "và một số ví dụ trong" Lippmans C ++ primer phiên bản thứ năm 2012 ":
Và nó thực sự đơn giản vì một trình tạo số ngẫu nhiên bao gồm hai phần:
(1) một công cụ tạo ra một chuỗi các giá trị ngẫu nhiên hoặc giả ngẫu nhiên. (2) phân phối ánh xạ các giá trị đó thành phân phối toán học trong một phạm vi.
Bất chấp ý kiến của anh chàng microsofts STL, Bjarne Stroustrups viết:
Trong, thư viện tiêu chuẩn cung cấp các công cụ và phân phối số ngẫu nhiên (§24.7). Theo mặc định, sử dụng default_random_engine, được chọn cho khả năng ứng dụng rộng rãi và chi phí thấp.
Các void die_roll()
ví dụ là từ Bjarne Stroustrups - ý tưởng tốt động cơ máy phát điện và phân phối với using
(thêm cơn rằng đây) .
Để có thể sử dụng thực tế các trình tạo số ngẫu nhiên được cung cấp bởi thư viện tiêu chuẩn ở <random>
đây, một số mã thực thi với các ví dụ khác nhau được giảm đến mức cần thiết nhất, hy vọng thời gian và tiền bạc an toàn cho các bạn:
#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;
}
Tôi nghĩ rằng nó đã bổ sung tất cả và như tôi đã nói, tôi đã mất rất nhiều thời gian để đọc nó và ví dụ như vậy - nếu bạn có thêm thông tin về thế hệ số, tôi rất vui khi biết về điều đó qua chiều hoặc trong phần bình luận và sẽ thêm nó nếu cần thiết hoặc chỉnh sửa bài đăng này. Bool