簡體   English   中英

含范圍uniform_real_distribution

[英]Inclusive range uniform_real_distribution

我正在嘗試使用隨機庫。 我知道這里有一個類似的問題: std :: uniform_real_distribution包含范圍 根據我的閱讀,它應該是[0,10)。 我嘗試使用[0,10],但是我嘗試了解決方案,但對我來說不起作用。 我不知道為什么。 這是一些代碼。

std::vector<int> vec;

int main()
{   
    const int min = 0;
    const int max = 10;
    std::random_device rd;
    std::mt19937 gen(rd());
    std::uniform_real_distribution<> dis(min, std::nextafter(max, INT_MAX));
    const int MAX = 10; 
    for (int i = 0; i < MAX; i++)
    {
        int t = dis(gen);
        vec.push_back(t);
    }
    for (auto& i : vec)
        std::cout << i << std::endl;
    system("pause");
    return 0;
}

我試過了:

std::uniform_real_distribution<> dis(min, std::nextafter(max, INT_MAX));
std::uniform_real_distribution<> dis{ 0, 10 };
std::uniform_real_distribution<> dis(min, max);

它只會隨機產生0到9,不像我希望的那樣包含10。 我正在VS2013上工作。

std :: uniform_real_distribution以實數工作,而不是整數。 結果很可能是dis(gen);的Real結果dis(gen); 將其存儲在Integer int t時,它被截斷。 由於在Real域中存在無限數量的可能值,因此不太可能在十次嘗試中返回恰好為10.0的值,即使這樣做, 浮點數不准確也有可能將其變為9.999999或類似值。

如果打開了編譯器的警告,則這將顯示為int精度損失警告的浮點數。

快速解決方案是

  1. 不要使用int來存儲返回的值
  2. 使用std :: uniform_int_distribution而不是uniform_real_distribution。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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