Điều này dễ nghĩ hơn nếu bạn bắt đầu bằng cách xem số nguyên. Nếu bạn vượt qua [-1, 1), bạn sẽ nhận được -1, 0
. Vì bạn muốn bao gồm 1
, bạn sẽ chuyển [-1, (1 + 1)) hoặc [-1, 2). Bây giờ bạn nhận được -1, 0, 1
.
Bạn muốn làm điều tương tự, nhưng với đôi:
vay từ this answer:
#include <cfloat> // DBL_MAX
#include <cmath> // std::nextafter
#include <random>
#include <iostream>
int main()
{
const double start = -1.0;
const double stop = 1.0;
std::random_device rd;
std::mt19937 gen(rd());
// Note: uniform_real_distribution does [start, stop),
// but we want to do [start, stop].
// Pass the next largest value instead.
std::uniform_real_distribution<> dis(start, std::nextafter(stop, DBL_MAX));
for (auto i = 0; i < 100; ++i)
{
std::cout << dis(gen) << "\n";
}
std::cout << std::endl;
}
(Xem mã chạy here)
Đó là, tìm ra lớn nhất tiếp theo đôi sau giá trị bạn muốn và chuyển giá trị đó thành giá trị cuối thay thế.
Tuyệt vời, cảm ơn bạn. VS2012 dường như không có chức năng này nhưng may mắn có nó trong [bộ công cụ toán học] (http://www.boost.org/doc/libs/1_53_0/libs/math/doc/sf_and_dist/html/math_toolkit/utils/ next_float/nextafter.html) –
Các bản phân phối điểm nổi tiêu chuẩn không cung cấp độ chính xác tới số cuối của độ chính xác, mà thay vào đó là các vấn đề làm tròn nghĩa là không thích hợp để thử sử dụng chúng theo cách này. – bames53