FONCTION DE CALCUL DU NOMBRE DE DUEL UNIQUE POUR UN NOMBRE N DE PARTICIPANT

coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 - 2 juin 2011 à 13:41
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 - 20 juin 2011 à 16:04
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/53231-fonction-de-calcul-du-nombre-de-duel-unique-pour-un-nombre-n-de-participant

coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
20 juin 2011 à 16:04
Le système suisse est un système de classement.
Il existe plusieurs systèmes de classements :
- le tableau de poules
- le tournois par élimination directe
- le montée descente
- le système suisse.

Le système suisse est utilisé aux échecs (par exemple).

Le tableau de poules tries les joueurs en O(n^2) parties, c'est donc très long.
Le tournois par élimination directe est chiant parce-qu'il ne laisse pas ses chances aux personnes qui se retrouvent directement contre le plus fort : il permet de trouver le meilleur si et seulement si la fonction de victoire est de la forme : si a > b et b > c alors a > c (transitive ?) Bref, c'est très peu précis pour la plupart des jeux.

Le montée descente est en O(n^2)

Le systeme suisse est en O(n * log(n)) ce qui est cool, et il est très précis.

C'est encore plus flagrant quand les joueurs ne sont pas deux mais plus sur une partie : on peut étendre toutes ces méthodes de tournois, et avoir des complexités encore plus horribles pour toutes sauf le système suisse et le tournois par élimination directe.

Bref, si vous faites un tournois, faites un système suisse, c'est fiable et rapide.
Utilisateur anonyme
20 juin 2011 à 15:53
+1 @leFauve42

Je pense même que sans commentaires, un débutant peut comprendre le code que tu as fait en l'analysant un minimum.

PS : @coucou747 : vois pas le rapport avec la Suisse ^^
LeFauve42 Messages postés 239 Date d'inscription vendredi 20 octobre 2006 Statut Membre Dernière intervention 20 avril 2009
7 juin 2011 à 13:11
ooops,

Desole, je n'avais pas vu la scrollbar, et donc pas vu le /2 a la fin.

A part ca, si il est toujours possible de reecrire n'importe quel program simple d'une ligne en 50, 100 ou meme plusieurs miliers de lignes illisibles, ca n'en fait pas pour autant un code de niveau "initie".

Eric
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
6 juin 2011 à 16:31
hum...

faut pas le prendre si mal.

le truc, c'est que ta fonction est vraiment simple, t'aurais mis un truc pour le systeme suisse ça aurait été différent, t'aurais fait une classe abstraite qui gère un tournois de poules pour N joueurs, ça aurait pu être intéressant.
mtrix000 Messages postés 31 Date d'inscription mardi 26 août 2008 Statut Membre Dernière intervention 1 novembre 2012
6 juin 2011 à 16:26
La preuve coucou747 qui est un expert n'a pas compris du premier cou :p
mtrix000 Messages postés 31 Date d'inscription mardi 26 août 2008 Statut Membre Dernière intervention 1 novembre 2012
6 juin 2011 à 16:23
Tous ceux qui est Logique n'est pas toujours évident, Initié car je ne met pas de commentaire, je vois mal un débutant comprendre ca...
function nDuel($nombre){

$list = array();
$start = 1;
$val = 0;
if($nombre >= 2){
do{
for($i=$nombre;$i>=$start;$i--){

for($y=$start;$y<=$nombre;$y++){
if(
!in_array("$i/$y",$list)
and !in_array("$y/$i",$list)
and $i != $y
){
$list[] = "$i/$y";
}
}

}
$start ++;
}while($start != $nombre);

$val = count($list);
}

return $val;
}

bref j'aurais du peut être ne rien partager.
mtrix000 Messages postés 31 Date d'inscription mardi 26 août 2008 Statut Membre Dernière intervention 1 novembre 2012
6 juin 2011 à 15:59
Bonjour LeFauve42, et les autres...

tous dabord pour ton : $n*($n-1)/2 je pense que tu n'as pas lu entièrement ma fonctio nDuel qui est :

function nDuel($nombreDeParticipant){
$nombreDeDuel = ($nombreDeParticipant * $nombreDeParticipant - $nombreDeParticipant ) / 2;
return $nombreDeDuel;
}

Donc c'est la même chose que ta fonction.

Si j'ai fais cette fonction c'est pour savoir combien il y a de 1 contre 1, avec un grand nombre de participant.

Merci pour le 1 :)
LeFauve42 Messages postés 239 Date d'inscription vendredi 20 octobre 2006 Statut Membre Dernière intervention 20 avril 2009
6 juin 2011 à 13:19
Oui, ca marche, mais un niveau initié pour une fonction de stats élémentaire vue en troisième ou en seconde...

Note que la formule utilisée n*(n-1) donne toutes les permutations.
Ca veut dire que x1 contre x2 et x2 contre x1 sont deux duels différents.

Si tu veux les "duels" uniques, il faut diviser par le nombre de permutations parmis n éléments, c'est à dire n! (dans ton cas, n=2, n! = 1*2 = 2).

donc, pour le nombre de duels la formule est :
$n*($n-1)/2

Pour ceux que ca interesse, la formule générale (nombre de groupes de m éléments pris parmis n éléments) est :
(n!/(n-m)!)/m! ou si vous préférez : n!/((n-m)!*m!)

Eric

PS: Désolé pour la note mais franchement, entre nous, tu pousses un petit peu, non ? (une multiplication et une soustraction... Initié... :o) )
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
6 juin 2011 à 10:51
ah c'est un tournois de poules...
lbasic Messages postés 18 Date d'inscription mardi 12 octobre 2004 Statut Membre Dernière intervention 23 mai 2011
6 juin 2011 à 10:43
Je pense que l'auteur a utilisé le mot "duel" dans le sens de "1 contre 1 et 1 seule fois"
sa fonction permet de calculer le nombre de "match" ou "partie" uniques entre deux personnes en fonction du nombre de participants.

en clair, le nombre de "partie" pour que tout le monde joue contre tout le monde 1 seule fois.

exemple avec 4 joueurs A,B,C,D

A-B
A-C
A-D
B-C
B-D
C-D

on obtiens 6 "parties".

CQFD
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
2 juin 2011 à 13:41
Bonjour,

Si un homme prend tout le monde en duel (quand il meurt, le gagnant prend les autres en duel, bref, ca revient au meme)

t'obtiens n - 1 combat... c'est beaucoup moins qu'avec ta fonction

Si tu parles d'un tableau d'élimination, on obtient a peu pres le meme chiffre (pour N une puissance de deux, ca fonctionne)

Bref, ce que fait ton code n'est pas clair...
Rejoignez-nous