随机概率很高的数字)?

时间:2012-07-04 22:38:27

标签: c++ random

  

可能重复:
  Biased Random Number Generator

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

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

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

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

任何想法?

我是一个菜鸟 - 非常感谢c ++风格的代码!

2 个答案:

答案 0 :(得分:2)

您可以这样做的一种方法是随机生成介于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%。根据我们随机分配的部分,我们选择适当的数字生成。

答案 1 :(得分:1)

您应该使用<random>库。

#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, " "));
}