Возможный дубликат:
C ++ функция для выбора из списка, где каждый элемент имеет определенную вероятность
Мне нужно случайным образом определить результат «да» или «нет» (вид броска монеты) на основе вероятности, которую я могу определить (.25, .50, .75).
Так, например, я хочу случайным образом определить, да или нет, где да имеет 75% шанс быть выбранным. Какие у меня есть варианты для этого? Есть ли библиотека C ++, которую я могу использовать для этого?
Вы можете легко реализовать это, используя rand
функция:
bool TrueFalse = (rand() % 100) < 75;
rand() % 100
даст вам случайное число от 0 до 100, и вероятность того, что оно будет меньше 75, составляет 75%. Вы можете заменить 75
для любой вероятности, которую вы хотите.
Проверьте в библиотеке C ++ 11 псевдослучайных чисел.
http://en.cppreference.com/w/cpp/numeric/random
http://en.wikipedia.org/wiki/C%2B%2B11#Extensible_random_number_facility
std::random_device rd;
std::uniform_int_distribution<int> distribution(1, 100);
std::mt19937 engine(rd()); // Mersenne twister MT19937
int value=distribution(engine);
if(value > threshold) ...
как это, то скажите, что все выше 75 это правда, а все ниже ложно, или любой другой порог, который вы хотите
В отличие от rand
на самом деле вы можете управлять свойствами генерации чисел, также я не верю, что rand, используемый в других ответах (по модулю), даже представляет равномерное распределение, что плохо.
std::random_device
или же boost::random
если std::random_device
не реализован вашим компилятором C ++, используя boost::random
ты можешь использовать bernoulli_distribution
генерировать случайный bool
значение!
Поскольку здесь никто, кажется, не слушает, я сам напишу правильный ответ.
std::mt19937 e(std::random_device());
std::bernoulli_distribution d(0.75);
if (d(e))
// ...
Отредактировано из-за хорошего комментария.
#include <cstdlib>
#include <iostream>
using namespace std;
bool yesOrNo(float probabilityOfYes) {
return rand()%100 < (probabilityOfYes * 100);
}
int main() {
srand((unsigned)time(0));
cout<<yesOrNo(0.897);
}
если ты позвонишь yesOrNo(0.75)
это вернется true
75% времени