gpt4 book ai didi

c++ - 为什么没有均匀分布?

转载 作者:IT老高 更新时间:2023-10-28 22:59:38 25 4
gpt4 key购买 nike

我们有 uniform_int_distributionuniform_real_distribution,难道不可能有一个包罗万象的 uniform_distribution ,它专门研究 float/double 和 int/...,何时指定?

最佳答案

AFAIU,上面@user877329 和@revolver_ocelot 的评论正确地解释了这一点,而另一个答案是完全错误的。

统一uniform_int的接口(interface)是错误的和 uniform_real ,不是因为它们的实现方式不同(这可以通过模板特化来解决),而是因为接口(interface)意味着不同的东西

假设我们统一接口(interface)(使用另一个答案中建议的变体),如下所示:

template <typename T>
using uniform_distribution =
typename std::conditional<
std::is_integral<T>::value,
std::uniform_int_distribution<T>,
std::uniform_real_distribution<T>
>::type;

如果我们定义 uniform_distribution<some_type> u(0, 9) ,意思很不一样:

  • 如果 some_type是整数,那么你将在大约 1/10 的时间内输出 9。

  • 如果 some_type不是,那么 u 永远不会输出 9。

以下代码(其输出是 true 然后是 false )说明了这一点:

#include <random>
#include <iostream>
#include <type_traits>

template <typename T>
using uniform_distribution =
typename std::conditional<
std::is_integral<T>::value,
std::uniform_int_distribution<T>,
std::uniform_real_distribution<T>
>::type;

int main()
{
std::random_device rd;
std::mt19937 gen(rd());

{
uniform_distribution<int> u(0, 9);
bool over_found = false;
for(size_t i = 0; i < 99999; ++i)
over_found = over_found || u(gen) >= 9;
std::cout << std::boolalpha << over_found << std::endl;
}

{
uniform_distribution<float> u(0, 9);
bool over_found = false;
for(size_t i = 0; i < 99999; ++i)
over_found = over_found || u(gen) >= 9;
std::cout << std::boolalpha << over_found << std::endl;
}
}

此代码说明使用此类编写通用代码是危险的。例如,如果您要编写一个通用函数来计算子范围内结果的直方图:[0, 1), [1, 2), ..., [8, 9),结果会不兼容。


正如@revolver_ocelot 所指出的,标准库的[inclusive-begin, exclusive_end) convention不能用于统一整数(因为不可能指定统一整数随机数生成器同时生成最大 uint 值),因此这是一个特殊的签名。

关于c++ - 为什么没有均匀分布?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38940216/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com