2013-04-25 31 views
9

C++ 11 std :: uniform_real_distribution (-1, 1) cho các số trong phạm vi [-1,1).std :: uniform_real_distribution phạm vi bao gồm

Bạn sẽ nhận được phân bố thực đồng đều trong khoảng [-1,1] như thế nào?

Thực tế nó có thể không quan trọng nhưng về mặt logic tôi đang cố chọn giá trị trong phạm vi bao gồm.

Trả lời

14

Đ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ế.

+1

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) –

+0

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

1

Thật không may, việc triển khai thực tế các bản phân phối dấu phẩy động không cho phép bạn chính xác như vậy. Ví dụ: uniform_real_distribution<float> được cho là tạo ra các giá trị trong một phạm vi nhất định nhất định, nhưng do các vấn đề làm tròn, thực tế nó có thể tạo ra các giá trị trong một phạm vi bao gồm.

Here's ví dụ về sự cố với generate_cannonical và các sự cố tương tự xảy ra với các phân bổ thực tế khác.

Các vấn đề liên quan