首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >类似discrete_distribution<float>的随机分布

类似discrete_distribution<float>的随机分布
EN

Stack Overflow用户
提问于 2019-08-04 10:15:22
回答 2查看 390关注 0票数 0

discrete_distribution只能用于整数类型,对于浮点数是否有类似之处?

我想写点什么

代码语言:javascript
复制
distribution<float> myDistribution = {0.1, 0.2, 0.5, 0.2};

int index = myDistribution(generator);

随机数的产生必须是O(log(N))。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-08-04 14:23:45

std::discrete_distribution的签名如下:

代码语言:javascript
复制
template< class IntType = int >
class discrete_distribution;

如所解释:

IntType -由生成器生成的结果类型。如果这不是shortintlonglong longunsigned shortunsigned intunsigned longunsigned long long中的一个,则效果是未定义的。

所以结果类型应该是一个整数。但权数的情况并非如此,它可以是浮点数。实际上,其中一个类的构造函数的签名是:

代码语言:javascript
复制
discrete_distribution( std::initializer_list<double> weights );

因此,我们可以使用浮点数作为权重:

代码语言:javascript
复制
#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 << " times\n";
    }

    return 0;
}

结果如下:

代码语言:javascript
复制
0 generated 1023 times
1 generated 1969 times
2 generated 5005 times
3 generated 2003 times

我们可以看到,在std::initializer_list中指示的权重是受尊重的。

票数 2
EN

Stack Overflow用户

发布于 2019-08-04 10:27:16

我更希望找到使它们都成为int的公共倍数,并在discrete_distribution中使用它。

或者,如果您确实需要的话,可以使用piecewise_constant_distribution。重量将是你的浮动和间隔,然后只是单位间隔。

代码语言:javascript
复制
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 )

但是,我认为标准不能保证这两个生成器的复杂性。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57345691

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档