Как я могу сгенерировать случайное логическое значение с вероятностью (от 1 до 100) в C?

Мне нужна функция, которая генерирует случайное логическое значение с заданной вероятностью от 1 до 100.

Я пробовал с этим:

int randProb(int chance, int min, int max) { 
     int random = rand();
     if (random < (RAND_MAX) / chance / 10) 
         return -(random % (max - min + 1) + min);
     else
         return (random % (max - min + 1) + min);
}

но когда я это называю, передавая 1 как вероятность

randProb(1, 0, 1)

иногда он возвращает 1, иногда -1, а иногда 0.

и когда я это называю, передавая 100 как вероятность

randProb(100, 0, 1)

иногда возвращает 0, а иногда 1, как и должно работать, с вероятностью 100 всегда должно возвращать 1.

Примечание время инициализируется следующим образом:

time_t t;
srand((unsigned) time(&t));
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
601
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Для генерации случайных значений вы можете использовать следующее выражение:

(rand() % (max - min + 1)) + min

Поскольку вам нужен шанс, лучше сгенерировать число от 0 до 100, имитируя проценты, а затем return result < chance, а именно:

int randProb(int chance) 
{
    int result = (rand() % (100 - 0 + 1)) + 0;
    return result < chance;
}

При изменении = 0 все значения, сгенерированные rand() % 101, будут больше или равны 0, поэтому result < chance всегда будет ложным (т. е. нулевым).

При изменении = 100 все значения, сгенерированные rand() % 101, будут меньше или равны 100, поэтому result < chance всегда будет истинным.

Наконец, например, для change=70 70 из 100 значений, сгенерированных rand() % 101, будут меньше или равны 70, поэтому result < chance будет возвращать true в 70% случаев. И так один и так далее.

Ответ принят как подходящий

Итак, если я правильно понял, ваша функция может возвращать два логических значения 0 и 1. Поэтому я не вижу причины, по которой вам нужны min и max в качестве параметров. Я бы так и сделал, скажите, если я не правильно понял вашу проблему.

    int randProb (int chance) {
    int random = (rand()%100)+1;
    
    if (random<=chance) {
        return 1;
    }
    else {
        return 0;
    }
}

Я не знаю C, но могу дать вам псевдокод, который может помочь

Генерировать случайное число от 0 до 100 если это 1, то yourBoolean = true (или false, как бы вы ни хотели быть редким), если нет, то yourBoolean = то, что вы хотите получить с вероятностью 99%.

Другие вопросы по теме