【问题标题】:Can I change a distribution parameters?我可以更改分布参数吗?
【发布时间】:2015-10-01 01:51:00
【问题描述】:

< random >中有uniform_int_distribution 当我创建它时,我定义了一个间隔。 我可以在创建后更改此间隔吗?

例如

std::uniform_int_distribution distr(0, 10);
// can I change an interval here ?    

【问题讨论】:

    标签: c++ random


    【解决方案1】:

    只需为变量分配一个新分布:

    std::uniform_int_distribution<int> distr(0, 10);
    
    distr = std::uniform_int_distribution<int>(5, 13);
    

    或者,为此创建一个参数(@awesomeyi 回答需要创建分发对象,这仍然需要创建 param_type 对象)

    std::uniform_int_distribution<int> distr(0, 10); 
    
    distr.param(std::uniform_int_distribution<int>::param_type(5, 13));
    

    证明 param_type 可以工作(对于@stefan):

    P 是相关的 param_type。它应满足 CopyConstructible、CopyAssignable 和 EqualityComparable 要求。它还具有采用相同参数的构造函数 与 D 的构造函数相同的类型并具有成员函数 与 D 的参数返回 getter 相同

    http://en.cppreference.com/w/cpp/concept/RandomNumberDistribution

    【讨论】:

    • param_type 是否保证构造函数采用两个值?我在 cppreference.com 上找不到任何东西
    • @stefan,对于 uniform_int_distribution?是的,您可以按照param_type 声明看到它。
    • 我看不到标准中对 param_type 构造函数的任何要求。你能指点我吗?我所能看到的是,param_typetypedef unspecified param_type。这表明,这样的构造函数不能保证。
    • @stefan,添加了链接
    • 找到对应的子句:是26.5.1.6 [rand.req.dist] 9。
    【解决方案2】:

    您可以通过param()功能。

    std::uniform_int_distribution<int> distr(0, 10);
    std::uniform_int_distribution<int>::param_type d2(2, 10);
    distr.param(d2);
    

    【讨论】:

    • 即无论如何我都需要一个新对象...这很可悲:(
    • @vlad4378 这可能还不错。你不会经常切换范围,对吧?如果范围的大小对所有人都相同,则只需添加一个偏移量即可。
    • @vlad4378 例如,如果您首先对介于 0 和 10 之间的值使用分布,但后来使用介于 10 和 20 之间的值,则可以使用相同的分布对象,但只需将 10 添加到所有值。跨度>
    • @谢谢,就是这样
    • @stefan 所以,如果我有 ditr。在 0 到 10 之间,然后是 0 ... 7 ,它没有帮助
    猜你喜欢
    • 1970-01-01
    • 2018-04-27
    • 1970-01-01
    • 1970-01-01
    • 2019-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-18
    相关资源
    最近更新 更多