C++ 包含范围均匀实分布
我正在尝试使用随机库。我知道这里有一个类似的问题:。据我所知,它应该是[0,10]。我尝试使用[0,10],但我尝试了解决方案,但它对我无效。我不知道为什么。下面是一些代码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
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)的实际结果很可能是;
存储在Integerint t
中时会被截断。因为实域中有无限多个可能的值,所以不太可能在十次尝试中返回正好10.0,即使返回了,也可能会将其转换为9.999999或类似的值
如果编译器的警告被打开,这将显示为float to int precision loss警告
快速解决方案是
实分布应该是某种浮点,而不是整数。当填充到
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);