一次我需要一个随机数生成器,其中至少有两个数字的概率比其他数字更高。
,例如:1000的序列中的随机1-> 10。数字A = 3且B = 7.
A - 应重复约。至少有20%的时间。 B - 应重复约。至少有30%的时间。
这应该涵盖1000序列的至少50%。 A和B的插入本身也应该是有些可能/随机的。不只是每隔N步添加A和B. 不需要完全/精确控制。
任何想法?
我是一个菜鸟 - 非常感谢c ++风格的代码!
答案 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, " "));
}