Я рассматриваю общество, где есть произвольное количество людей. У каждого человека есть только два варианта. Либо он или она остается с ее текущим выбором, либо она переключается. В коде, который я хочу написать, вероятность того, что человек переключается, вводится пользователем.
Чтобы прояснить, что я пытаюсь сделать, предположим, что пользователь говорит компьютеру, что в обществе есть 3 человека, где вероятности, которые каждый человек выбирает для переключения, определяются как (p1, p2, p3). Рассмотрим человека 1. У него есть вероятность p1 переключения. Используя его в качестве основы для нашего расчета, вероятность, указанная человеком 1 в качестве основы, которую точно никто в обществе не хочет переключать, определяется как
Р- {1} (0) = (1-р2) * (1-р3)
и вероятность использования человека 1 в качестве основы, которую выберет ровно один человек в обществе, определяется выражением
Р- {1} (1) = р2 * (1-р3) + (1-р2) * р3.
Я не могу понять, как написать эту функцию вероятности в C ++, не выписывая каждый член суммы. Я рассмотрел использование биномиального коэффициента, но не могу найти выражение для закрытой формы для суммы, так как в зависимости от пользовательского ввода, существует произвольно много вероятностей, которые необходимо учитывать.
Я приложил то, что у меня есть. Функция вероятности — это только часть того, что я пытаюсь сделать, но также и самая сложная часть. Я назвал вероятностную функцию вероятностной, и то, что у меня есть в цикле for внутри функции, явно неверно.
РЕДАКТИРОВАТЬВ основном я хочу вычислить вероятность выбора подмножества, где каждый элемент в этом подмножестве имеет различную вероятность выбора.
Буду признателен за любые советы о том, как это сделать. Обратите внимание, что я новичок в C ++, поэтому любые советы по улучшению моих навыков программирования также приветствуются.
#include <iostream>
#include <vector>
using namespace std;
unsigned int factorial(unsigned int n);
unsigned int binomial(unsigned int bin, unsigned int cho);
double probab(int numOfPeople, vector<double> probs, int p, int num);
int main() {
char correctness;
int numOfPeople = 0;
cout << "Enter the # of people: ";
cin >> numOfPeople;
vector<double> probs(numOfPeople); // Create a vector of size numOfPeople;
for (int i = 1; i < numOfPeople+1; i++) {
cout << "Enter the probability of person "<< i << " will accept change: ";
cin >> probs[i-1];
}
cout << "You have entered the following probabilities of accepting change: (";
for (int i = 1; i < numOfPeople+1; i++) {
cout << probs[i-1];
if (i == numOfPeople) {
cout << ")";
}
else {
cout << ",";
}
}
cout << endl;
cout << "Is this correct? (Enter y for yes, n for no): ";
cin >> correctness;
if (correctness == 'n') {
return 0;
}
return 0;
}
unsigned int factorial(unsigned int n){ // Factorial function
unsigned int ret = 1;
for(unsigned int i = 1; i <= n; ++i) {
ret *= i;
}
return ret;
}
unsigned int binomial(unsigned int totl, unsigned int choose) { // Binomial function
unsigned int bin = 0;
bin = factorial(totl)/(factorial(choose)*factorial(totl-choose));
return bin;
}
double probab(int numOfPeople, vector<double> probs, int p, int num) { // Probability function
double prob = 0;
for (int i = 1; i < numOfPeople; i++) {
prob += binomial(numOfPeople, i-1)/probs[p]*probs[i-1];
}
return prob;
}
Для дальнейшего использования, для любого, кто пытается это сделать, функция вероятности будет выглядеть примерно так:
double probability (vector<double> &yesprobabilities, unsigned int numOfPeople, unsigned int yesNumber, unsigned int startIndex) {
double kprobability = 0;
// Not enough people!
if (numOfPeople-1 < yesNumber) {
kprobability = 0;
}
// n == k, the only way k people will say yes is if all the remaining people say yes.
else if (numOfPeople-1 == yesNumber) {
kprobability = 1;
for (int i = startIndex; i < numOfPeople-1; ++i) {
kprobability = kprobability * yesprobabilities[i];
}
}
else if (yesprobabilities[startIndex] == 1) {
kprobability += probability(yesprobabilities,numOfPeople-1,yesNumber-1,startIndex+1);
}
else {
// The first person says yes, k - 1 of the other persons have to say yes.
kprobability += yesprobabilities[startIndex] * probability(yesprobabilities,numOfPeople-1,yesNumber-1,startIndex+1);
// The first person says no, k of the other persons have to say yes.
kprobability += (1 - yesprobabilities[startIndex]) * probability(yesprobabilities,numOfPeople-1,yesNumber,startIndex+1);
}
return probability;
}
Здесь используется нечто, называемое рекурсивной функцией. Это абсолютно новое для меня и очень интересное. Я приписываю это Калле из Математической биржи. Я немного изменил его версию, чтобы с некоторой помощью брать векторы вместо массивов.
Других решений пока нет …