随机分布,如discrete_distribution<float>
Random distribution like discrete_distribution<float>
discrete_distribution只能与整数类型一起使用,浮点数有类似的东西吗?
我想写类似的东西
distribution<float> myDistribution = {0.1, 0.2, 0.5, 0.2};
int index = myDistribution(generator);
重要的是,随机数生成为 O(log(N))。
std::discrete_distribution
的签名如下:
template< class IntType = int >
class discrete_distribution;
如前所述:
IntType- 生成器生成的结果类型。如果不是
short
、int
、long
、long long
、unsigned short
、unsigned int
、unsigned long
或unsigned long long
之一,则效果是不确定的。
因此,结果类型应为整数。但权重不是这样,他们可以是浮点数。实际上,此类的一个构造函数的签名是:
discrete_distribution( std::initializer_list<double> weights );
因此,我们可以使用浮点数作为权重:
#include <iostream>
#include <random>
#include <map>
#include <vector>
int main()
{
std::random_device rd;
std::mt19937 gen(rd());
std::discrete_distribution<int> myDistribution = {0.1, 0.2, 0.5, 0.2};
std::map<int, int> m;
for(int n=0; n<10000; ++n) {
++m[myDistribution(gen)];
}
for(auto p : m) {
std::cout << p.first << " generated " << p.second << " timesn";
}
return 0;
}
结果如下:
0 generated 1023 times
1 generated 1969 times
2 generated 5005 times
3 generated 2003 times
我们可以看到std::initializer_list
中指示的权重得到了尊重。
我宁愿找到使它们全部为整数的公共倍数并在discrete_distribution
中使用它。
或者,如果您确实需要,您可以使用piecewise_constant_distribution
。权重将是您的浮点数,间隔只是单位间隔。
std::vector<double> i{0.0, 1.0, 2.0, 3.0, 4.0};
std::vector<double> w{0.1, 0.2, 0.5, 0.2};
std::piecewise_constant_distribution<> d(i.begin(), i.end(), w.begin());
(然后将结果投射到地板的 int)
但是,我认为该标准不能保证任一生成器的复杂性。
相关文章:
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 呼叫运营商<<临时
- 如何防止clang格式在流运算符调用之间添加换行符<<
- <<操作员在下面的行中工作
- System.InvalidCastException - SQL to C++ - safe_cast<float>
- 没有从阵列<float>到阵列<int>的可行转换
- 数组下标的类型"float*[float]"无效
- 没有合适的构造函数可以从"float"转换为"_D3DCOLORVALUE"
- 为什么我会收到此错误?无法将 {lb, ub} 从<大括号括起来的初始值设定项列表>转换为 float(**)(float*, int)
- 将 **float array 从 C++ Dll 传递给 python
- 错误:二进制'operator*' 'float'和'float[0]'类型的操作数无效
- float* 已在 Gameobject.obj 中定义
- 如何将 qml 的文本转换为 float 和 int
- 为什么将 1 添加到 numeric_limits<float>::min() 返回 1?
- 有没有比static_cast更优雅的从int到float的演员阵容<float>?
- 编译器给出错误:format 指定类型 'float *',但参数的类型'double' [-Wformat]
- OPENCL 警告:不兼容的指针类型将'float __global[16]'传递给类型为 '__global float4 的参数 *
- 错误:无法将"float*"转换为"float"
- 如何在函数中将字符串和分数存储为(Int 或 float)
- 缩小从double到float的转换