Dénombrement: nombre de boucle

cs_Pierebean Messages postés 3 Date d'inscription dimanche 27 juin 2004 Statut Membre Dernière intervention 14 mai 2009 - 16 avril 2007 à 11:11
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 - 27 avril 2007 à 15:08
Bonjour à tous,

Je suis nouveau sur ce forum j'espère que je respecter les rêgles(en fait je ne sais pas si je suis dans la bonne section).

Voici mon problème:

Vous avez n personnes. Dans un panier (c'est plus champêtre que l'urne de nos livres de maths) se trouvent les noms de chacune de ces n personnes.

Chaque personne tire au hasard le nom d'un autre personne. Il ne peut pas se choisir lui même.

Ma question est la suivante:
Quelle est le nombre le plus probable de boucle pour n personnes.

J'appele boucle la situation suivante:

Michel tire le nom "Jacques".
Jacques tombe sur "Hubert".
Hubert tombe sur "Jennifer".
Jennifer tombe sur Michel.
La boucle est bouclée.

J'ai fait une essai avec ma famille. Nous étions 31 nous sommes tombé sur quatres boucles.

En gros, voilà ce que je cherche. Je ne vois vraiment pas comment résoudre ce problème d'une manière théorique. j'imagine qu'il faut utiliser les combinaisons.
Je me suis dis que je pouvais résoudre l'affaire en utilisant le c en programmant un grand nombre de tirage. Le problème c'est que je ne vois pas comment programmer la notion de boucle.

Merci de votre aide.
A vous lire.

Pierebean

<!-- / message -->
<!-- edit note -->

5 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
16 avril 2007 à 12:54
#define NBR 31


int *prs; // Tableau des personnes
int i, j, v;


prs = (int*) malloc(NBR * sizeof(int));
if(!prs) return;
srand(GetTickCount());
i = 0;
nextNBR:
  v = rand() % NBR;
  if(v == i) goto nextNBR; // INTERDIT SOI MEME
  // VERIF NON DEJA PRIS  for(j 0; j < i; j++) if(prs[j] v) goto nextNBR;
 
prs[i] = v;
  if(++i < NBR) goto nextNBR;


Affichage et free(prs);

ciao...
BruNews, MVP VC++
0
ndubien Messages postés 557 Date d'inscription dimanche 25 septembre 2005 Statut Membre Dernière intervention 10 mai 2014 4
16 avril 2007 à 16:53
Bonjour,


Pour utilser des boucles dans un programme il y a deux méthodes :
- le for : qui effectue un nombre de boucle précis
- le while : qui effectue autant de boucle qu'il faut afin que la condition soit validée

Pour plus d'informations à propos de ces "fonctions" voir : http://c.developpez.com/cours/bernard-cassagne/node33.php







<hr />
J'espère avoir été utile.









Nico
/U>
0
ndubien Messages postés 557 Date d'inscription dimanche 25 septembre 2005 Statut Membre Dernière intervention 10 mai 2014 4
16 avril 2007 à 16:55
Oups je me suis trompé, désolé, il y a plus de deux méthodes.
Il existe aussi le do.

<hr />
Nico/U>
0
cs_Pierebean Messages postés 3 Date d'inscription dimanche 27 juin 2004 Statut Membre Dernière intervention 14 mai 2009
27 avril 2007 à 11:49
réponse à BruNews:


->Est-ce que je peux faire un scanf pour NBR à la place de le metre dans un define?


->Mon emacs (sur Linus fedora core) ne connait pas "GetTickCount()"
(déclaration implicite). Y a t-il une alternative? à quoi sert cette
fonction?


->Qu'est ce qui est sous entendu par "Affichage" dans "Affichage et free(prs);" un printf sur quoi?


Merci


Pierebean
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
27 avril 2007 à 15:08
Tu récup NBR comme tu l'entends.
Ton Linux ne sait pas requeter sur google ? Si oui, tu verrais que GetTickCount() est API Windows, tu remplaceras par time(NULL) ou truc de ce genre.
"Affichage" ne sous-entend rien, le mot est sans ambiguité, tu affiches où tu veux si tu le veux.

ciao...
BruNews, MVP VC++
0
Rejoignez-nous