Tôi không chắc Mersenne Twister C++11 cung cấp những biến thể nào. hiện hữu Mersenne twister: Bộ tạo số giả ngẫu nhiên thống nhất phân bố đều theo chiều 623 Hãy xem bài báo của Matsumoto và Nishimura ACM, nơi các tác giả cung cấp thuật toán, cách triển khai thuật toán và gọi nó làMT19937
.
Tuy nhiên, khi tôi kiểm tra trình tạo cùng tên của C++ 11 với applet sau, tôi không thể tái tạo luồng do MT19937 của Matsumoto và Nishimura tạo ra. Luồng này khác với từ 32 bit đầu tiên được tạo ra.
C++ 11 cung cấp Mersenne Twister gì?
Chương trình sau đây sử dụng GCC,-std=c++11
và GNU stdlibc++
Chạy trên Fedora 22.
std::mt19937 prng(102013);
cho (unsign int i = 0; i <= 625; i++)
{
cout << std::hex << prng();
nếu(i+1 != 625)
cout << ",";
if(i && i%8 == 0)
cout << endl;
}
Nhìn vào MT19937 từ tệp bạn đã liên kết đến và định nghĩa tiêu chuẩn, có vẻ như chúng giống nhau nhưng có thêm lớp ủ bổ sung và hệ số khởi tạo
Nếu chúng ta nhìn vào các giá trị được xác định trong [Rand.predef] 26.5.5(3) so với các tham số được xác định bởi bài báo, chúng ta có
32,624,397,31,0x9908b0df,11,0xffffffff,7,0x9d2c5680,15,0xefc60000,18,1812433253 <- tiêu chuẩn
w ,n ,m ,r ,a ,u ,d ,s,b ,t ,c ,l ,f
32,624,397,31,0x9908b0df,11, ,7,0x9d2c5680,15,0xefc60000,18, <- giấy
Đây là nơi sự khác biệt đến từ. Cũng theo tiêu chuẩn,std::mt19937
Lần lặp thứ 10.000 của là 399268537
Tôi là một lập trình viên xuất sắc, rất giỏi!