Как я могу заставить что-то произойти х процентов? - PullRequest
0 голосов
/ 10 октября 2019

Я должен написать кусок кода в виде 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 ]

4 голосов
/ 10 октября 2019

Вы можете использовать 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 голос
/ 10 октября 2019

Значение 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));

edit: std :: piecewise_constant_distribution более элегантный, не знал опока я не прочитаю другой ответ.

0 голосов
/ 10 октября 2019

Я попробовал здесь @ [http://codepad.org/DLbVfNVQ]. Среднее значение где-то в районе 0,4. -CR

0 голосов
/ 10 октября 2019

Если вам нужно портативное решение, которое не зависит от стандартной библиотеки C ++, а также является более быстрым и, возможно, более простым для понимания, вы можете использовать следующий фрагмент. Переменная random_sequence - это предварительно сгенерированный массив случайных чисел, где 0 встречается в 10% случаев. Переменные runs и len используются для индексации в этом массиве как бесконечная последовательность. Это, однако, простое решение, так как шаблон будет повторяться после 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();

И если вы хотите, чтобы онибыть 0 10% времени вместе, тогда массив 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...