2010-08-15 4 views
4

J'ai été capable de résoudre le problème suivant en utilisant std :: next_permutation (C++) etc, mais je suis maintenant en train d'y penser de façon plus générale et j'aimerais beaucoup pour former une expression comme ce type de problème semble se prêter - même si je n'ai pas de chance pour le moment.Énumération d'un ensemble de permutations basées sur une condition

Voici la question:

Étant donné une course à pied avec les participants N, quelle est la probabilité que les candidats exactement M se terminera dans une position qui est le même que le numéro sur leur chemise. Où M < = N.

Ce que je l'ai fait jusqu'à présent:

  1. Il y aura N! J'ai essayé de jouer avec une petite variante du problème consistant en 3 ou 4 participants avec le nombre requis de personnes remplissant la condition comme étant 2. dans les deux cas pour 2 personnes finissant dans l'ordre particulier la probabilité est de 1/2

Je voudrais savoir s'il existe déjà une sorte d'expression qui gère tous les cas?

Certains code:

#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; 
} 

Update: L'expression est appelé Derangement partielle:

http://mathworld.wolfram.com/PartialDerangement.html

Note 1: La formule est correcte, si l'on suppose que le pleinement La permutation ordonnée ne compte pas.

Note2: J'ai légèrement changé la question pour la rendre plus claire, donc aussi changé en code - cela devrait être reconsidéré avec les commentaires faits par ShreevatsaR.

+1

Quel est le but de la branche 'else' dans votre code source? Cela ne compte pas les permutations directement, mais quelque chose d'autre. – grddev

+0

@grddev: il prend en compte les chevauchements, pour la permutation 1234 où on s'intéresse aux couples qui sont dans le bon ordre, on voit qu'il y a en fait 4 paires. doit être compté correctement. –

+0

Un peu intelligent (c'est un mot?), Mais la probabilité dépend en réalité de la distribution de probabilité sur l'ordre d'arrivée pour les athlètes individuels. Par exemple, dans un cas extrême où le coureur le plus lent porte le numéro 1, le deuxième plus lent porte le numéro 2, etc, la probabilité serait nulle pour M> 0. –

Répondre

0

Il y a deux définitions que vous devez résoudre ce sous forme fermée:

  1. Le nombre de façons de permute personnes N est N! (N factoriel), ou N * N-1 * N-2 * ... * 1. Ceux-ci sont appelés permutations.

  2. Le nombre de façons de choisir M personnes de N est appelé (N choisir M), et il est égal à N!/(M! (N-M)!) - ceux-ci sont appelés combinaisons. (Si cela est nouveau pour vous, faire une recherche Google pour « permutations et combinaisons ».)

Je travaille sur une solution sous forme fermée ...

2
+0

... ou "dérangements"? –

+2

Une référence plus utile de wikipedia pourrait être [Numéros de rencontres] (http://en.wikipedia.org/wiki/Rencontres_numbers) si vous êtes seulement intéressé par les résultats – grddev

+0

@dman: Oui, la formule est correcte. Pour n = 5 et m = 3, vous avez D (5,3) = (5!/3!) (1/0! - 1/1! + 1/2!) = (20) (1-1 + 1/2) = 10. Et il y a en effet 10 permutations - 01243, 01324 , 01432, 02134 , 03214, 04231 , 10234, 21034 , 31204, 41230 - de 5 éléments qui ont 3 points fixes. Donc, la probabilité est de 10/5! = 10/120 = 1/12 = 0,83333, et non 0,333 comme vous le dites dans la question. – ShreevatsaR

Questions connexes