Tôi rất ngạc nhiên khi thấy rằng đầu ra của chương trình này:Có bao nhiêu số ngẫu nhiên std :: uniform_real_distribution sử dụng?
#include <iostream>
#include <random>
int main()
{
std::mt19937 rng1;
std::mt19937 rng2;
std::uniform_real_distribution<double> dist;
double random = dist(rng1);
rng2.discard(2);
std::cout << (rng1() - rng2()) << "\n";
return 0;
}
là 0
- ví dụ: std::uniform_real_distribution
sử dụng hai số ngẫu nhiên để tạo ra một double
giá trị ngẫu nhiên trong khoảng [0,1). Tôi nghĩ rằng nó sẽ chỉ tạo ra một và rescale đó. Sau khi suy nghĩ về nó, tôi đoán rằng điều này là bởi vì std::mt19937
sản xuất int 32 bit và gấp đôi kích thước này gấp đôi và do đó không "đủ ngẫu nhiên".
Câu hỏi: Làm cách nào để tìm ra con số này một cách tổng quát, tức là nếu trình tạo số ngẫu nhiên và loại dấu phẩy động là các loại tùy ý?
Chỉnh sửa: Tôi vừa nhận thấy rằng tôi có thể sử dụng std::generate_canonical
thay vào đó, vì tôi chỉ quan tâm đến số ngẫu nhiên [0,1]. Không chắc chắn nếu điều này làm cho một sự khác biệt.
Bạn không thể tìm thấy điều này một cách tổng quát. –
@ R.MartinhoFernandes: vì ... – arne
Như một sang một bên, hãy suy nghĩ về những gì nó có nghĩa là để "rescale" một số nguyên 32-bit cho một đôi 64-bit: có khoảng 2^62 giá trị kép riêng biệt. Có 2^32 giá trị int riêng biệt. Điều này có nghĩa rằng chỉ có ** một trong số hàng tỷ ** giá trị gấp đôi có thể là đại diện trong kết quả kép. Điều này rõ ràng là không thể chấp nhận được. – JohannesD