簡體   English   中英

std :: uniform_real_distribution包含范圍

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM