Мне удалось решить следующую проблему с помощью std :: next_permutation (c ++) и т. Д., Но сейчас я подумываю об этом в более общем плане и очень хотел бы сформировать выражение, поскольку проблема такого типа кажетсякредитовать себя - хотя мне пока не везет.
Вот вопрос:
Учитывая бегущую гонку с N участниками, какова вероятность того, что именно M участников будутзакончить в положении, которое совпадает с номером на их рубашке.Где M <= N. </p>
Что я сделал до сих пор:
Там будет N!способы окончания гонки:
Я попытался поиграть с небольшим вариантом задачи, состоящим из 3 или 4 участников, с необходимым количеством людей, удовлетворяющих условию как 2.в обоих случаях для 2 человек, заканчивающих в определенном порядке, вероятность составляет 1/2
Я хотел бы знать, есть ли уже какое-то выражение, которое обрабатывает все случаи?
Какой-то код:
#include <cstdio>
#include <algorithm>
#include <vector>
int main(int argc, char* argv[]) {
if (argc != 3) return 1;
int n = atoi(argv[1]);
int m = atoi(argv[2]);
if (m > n) return 1;
std::vector<int> lst(n);
for (int i = 0; i < n; ++i) lst[i] = i;
unsigned int total = 0;
unsigned int perm_count = 0;
do {
int cnt = 0;
for (int i = 0; i < n; ++i) if (lst[i] == i) ++cnt;
if (cnt == m)
++total;
++perm_count;
}
while (std::next_permutation(lst.begin(),lst.end()));
printf("Probability of (%d,%d) = %8.7f\n",n,m,(1.0 * total / perm_count));
return 0;
}
Обновление: Выражение называется частичным расстройством:
http://mathworld.wolfram.com/PartialDerangement.html
Примечание 1: Формула верна, если предположить, что полностью упорядоченная перестановка не учитывается.
Примечание 2: Я немного изменил вопрос, чтобы сделать его более понятным, поэтомутакже изменен на код - это должно согласовываться с комментариями, сделанными ShreevatsaR.