【问题标题】:Random with a high probabilty number(s)? [duplicate]具有高概率数字的随机数)? [复制]
【发布时间】:2012-07-04 22:38:26
【问题描述】:

可能重复:
Biased Random Number Generator

有一次我需要一个随机数生成器,其中至少有两个数字比其他数字具有更高的概率。

例如:1000 序列中的随机 1->10。数字 A=3 和 B=7。

A - 应该重复大约。至少 20% 的时间。 B - 应该重复大约。至少 30% 的时间。

这应该至少涵盖 1000 序列的 50%。此外,A 和 B 的插入本身应该有点可能/随机。不只是每第 N 步添加 A 和 B。 不需要完全/精确控制。

有什么想法吗?

我是一个菜鸟 - c++ 风格的代码将不胜感激!

【问题讨论】:

    标签: c++ random


    【解决方案1】:

    您可以这样做的一种方法是随机生成一个介于 0.0 和 1.0 之间的数字,并根据该数字选择要生成的数字。例如,要实现您的示例场景(伪代码):

    let "result" be an array of 1000 integers
    let "i" be an integer
    for i = 1 to 1000:
        let "j" be a random number between 0.0 and 1.0
        if j < 0.2:
            let result[i] be 3
        else if j < 0.5:
            let result[i] be 7
        else:
            let "k" be an integer
            do, while k = 3 or k = 7:
                let "k" be a random number in the range 1 to 10
            let result[i] be k
    end
    

    基本上,j 用于将范围 1 到 10 划分为三个部分 - 一部分覆盖范围的 0% 到 20%(第一个 if),第二个覆盖 20% 到 50%范围(即 30% 宽,第二个 if),最后一个覆盖剩余的 50%。根据我们随机落入的部分,我们选择适当的数字来生成。

    【讨论】:

    • 这仍然取决于原始随机生成器。也忘了更具体。它用于 Arpregiator - 用于音乐合成器。假设值是数组 [24] (这是音乐中的两个八度音阶,分布映射会使值过于接近给定点 - 在我的情况下为 A 和 B。A 和 B 应该有概率(整数),其余的应该是随机(整数)。
    • 抱歉,请阅读您回复的更新 - 应该可以。谢谢!
    【解决方案2】:

    您应该为此使用 &lt;random&gt; 库。

    #include <random>
    
    #include <iostream>
    #include <algorithm>
    #include <iterator>
    
    int main() {
        // create a discrete distribution where the third object has 20% probability and
        //   the seventh has 30%
        std::vector<double> probabilities(10, 5.0/8.0);
        probabilities[2] = 2.0;
        probabilities[6] = 3.0;
        std::discrete_distribution<int> dist(begin(probabilities),end(probabilities));
    
        // our underlying source of randomness
        std::random_device r;
        std::seed_seq seed{r(), r(), r(), r(), r(), r(), r(), r()};
        std::mt19937 eng(seed);
    
        // create a function object that uses the distribution and source of randomness to
        //   produce values from 1 to 10
        auto rand = [&]{ return dist(eng) + 1; };
    
        std::vector<int> x;
    
        // store 1000 random values
        for (int i=0;i<1000;++i)
            x.push_back(rand());
    
        // count how many of each value, to verify that 3 comes out ~200 times and 7 comes
        //   out ~300 times
        for (int i=1;i<=10;++i)
            std::cout << i << ": " << count(begin(x),end(x),i) << '\n';
    
        // print all the values
        copy(begin(x),end(x),std::ostream_iterator<int>(std::cout, " "));
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-06
      • 2017-05-16
      • 2012-02-11
      • 2013-07-10
      • 2011-04-10
      相关资源
      最近更新 更多