2012-07-04 114 views
2

可能重复:
Biased Random Number Generator高概率数的随机?

一次我需要有比别人高probabality至少两个数的随机数发生器。

即,例如:序列1000中随机1→10。数字A = 3和B = 7。

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

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

任何想法?

我是noob-C++风格的代码将不胜感激!

回答

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%。根据我们随机落入的部分,我们选择合适的数字进行生成。

+0

这仍然取决于原始的随机生成器。也忘记了更具体。它用于Arpregiator--用于音乐合成器。说数值是数组[24](这是音乐中的两个八度音,分布映射会将数值聚集得太接近给定点 - A和B在我的情况中.A和B应该有概率(整数),其余应该是随机(整数) –

+0

对不起,刚刚阅读您的回复更新 - 应该工作。谢谢! –

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