如何使某事发生x百分比?

时间:2019-10-10 15:41:42

标签: c++ c++11

我必须以c * b的形式编写一段代码,其中c和b是随机数,乘积小于INT_MAx。但是b或c必须等于0 10%的时间,我不知道该怎么做。

    srand ( time(NULL) );
    int product = b*c;

    c = rand() % 10000;
    b = rand()  % INT_MAX/c;
            b*c < INT_MAX;

    cout<<""<<endl;
    cout << "What is " << c << "x" << b << "?"<<endl;
            cin >> guess;

4 个答案:

答案 0 :(得分:4)

您可以使用std::piecewise_constant_distribution

 std::random_device rd; 
 std::mt19937 gen(rd());
 double interval[] = {0, 0, 1, Max};
 double weights[] = { .10, 0, .9};     
 std::piecewise_constant_distribution<> dist(std::begin(interval),
                                             std::end(interval),
                                             weights);
 dist(gen);

答案 1 :(得分:1)

int始终小于或等于INT_MAX,因此您可以简单地用两个均匀分布的整数的乘积乘以90%的概率将真布尔型变量相乘:

std::random_device rd;
std::mt19937 generator(rd());
std::uniform_int_distribution<int> uniform;
std::bernoulli_distribution bernoulli(0.9); // 90% 1 ; 10% 0
const int product = bernoulli(generator) * uniform(generator) * uniform(generator)

如果您有特定的限制,例如对单个数字说N,对两个数字的乘积说M,则可以执行以下操作:

std::default_random_engine generator;
std::uniform_int_distribution<int> uniform(0,N);
std::bernoulli_distribution bernoulli(0.9); // 90% 1 ; 10% 0
int product;
do { product = bernoulli(generator) * uniform(generator) * uniform(generator) }
while(!(product<M));

编辑:std :: piecewise_constant_distribution更优雅,直到我读完另一个答案才知道。

答案 2 :(得分:0)

如果您想要一个不依赖于标准C ++库的可移植解决方案,并且该解决方案更快,更容易理解,则可以使用以下代码段。变量random_sequence是预先生成的随机数数组,其中0发生在10%的时间。变量runslen用于以无穷序列索引到此数组。但是,这是一个简单的解决方案,因为模式将在运行90次后重复。但是,如果您不关心重复模式,则此方法会很好用。

int runs = 0;
int len = 90; //The length of the random sequence.
int random_sequence[] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 };

int coefficient = random_sequence[runs % len];
runs++;

然后,无论您希望变量为0还是10%的时间都像这样:

float b = coefficient * rand();

float c = coefficient * rand();

如果您希望两个变量的次数分别为0 10%,则如下所示:

float b = coefficient * rand();
coefficient = random_sequence[runs % len];
float c = coefficient * rand();

如果您希望它们在10%的时间内共同为0,那么random_sequence数组必须像这样:

int len = 80;
int random_sequence[] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 };

并使用

float b = coefficient * rand();
float c = coefficient * rand();

答案 3 :(得分:0)

我在这里给了他一个镜头@ [http://codepad.org/DLbVfNVQ]。平均值在0.4左右。 -CR