[英]std::uniform_real_distribution inclusive range
C ++ 11 std :: uniform_real_distribution(-1,1)給出了[-1,1]范圍內的數字。
你如何在[-1,1]范圍內獲得統一的實際分布?
實際上它可能沒關系,但從邏輯上講,我正試圖在包含范圍內選擇一個值。
如果從查看整數開始,這更容易思考。 如果你傳遞[-1,1),你會期望得到-1, 0
。 由於您想要包含1
,因此您將傳遞[-1,(1 + 1))或[-1,2]。 現在你得到-1, 0, 1
。
你想做同樣的事情,但有雙打:
借用這個答案 :
#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;
}
(參見此處運行的代碼)
也就是說,在你想要的之后找到下一個最大的double值,並將其作為結束值傳遞。
不幸的是,浮點分布的實際實現不允許您如此精確。 例如, uniform_real_distribution<float>
應該產生給定半范圍內的值,但是由於舍入問題,它實際上可能產生包含范圍內的值。
以下是 generate_cannonical
問題的示例,其他real_distributions也會出現類似問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.