C++ 包含范围均匀实分布

C++ 包含范围均匀实分布,c++,c++11,random,C++,C++11,Random,我正在尝试使用随机库。我知道这里有一个类似的问题:。据我所知,它应该是[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

我正在尝试使用随机库。我知道这里有一个类似的问题:。据我所知,它应该是[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::向量向量向量机;
int main()
{   
常数int min=0;
常数int max=10;
std::随机_装置rd;
标准:mt19937 gen(rd());
标准:均匀实分布分布(最小,标准::下一次(最大,整数最大));
常数int MAX=10;
对于(int i=0;idis(gen)的实际结果很可能是;
存储在Integer
int t
中时会被截断。因为实域中有无限多个可能的值,所以不太可能在十次尝试中返回正好10.0,即使返回了,也可能会将其转换为9.999999或类似的值

如果编译器的警告被打开,这将显示为float to int precision loss警告

快速解决方案是

  • 不要使用int来存储返回的值
  • 使用而不是均匀实分布

  • 实分布应该是某种浮点,而不是整数。当填充到
    int t
    中时,9.99999而不是10.0000是一种明显的可能性,它将被截断为9。你真的想要
    统一的int\u分布
    ?在
    [0,10]上的
    统一的实分布的可能性
    products 10…非常小。换句话说:从统计上看,您想要的东西与您已经拥有的东西是无法区分的。我尝试了解决方案1,将返回值存储为双精度,但没有效果。解决方案2非常有效。谢谢!我不认为FP不准确会将10.0变为9.9999x,因为它完全是representable。将10.0/3转换为3.33333才是真正的问题,因为10.0/3并不是完全可表示的。@mAlters这是一个有趣的问题。必须检查数学,但10不是计算出来的,是2的一个很好的倍数,所以听起来很合理。@user4581301:它只是1.01
    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);