Comment calculer des combinaison

Résolu
Frank_klein Messages postés 34 Date d'inscription samedi 26 mars 2005 Statut Membre Dernière intervention 8 février 2022 - 31 juil. 2008 à 12:15
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 - 2 août 2008 à 23:35
Bonjour,

J'ai cherché sur le forum des exemples sur le calcul des combianaisons, mias sans succès, sur Google aussi, je n'ai trouvé que des exemples en visual basic, est il possible de faire des calculs de combinasion avec delphi, je conais la formule mathematique mais je n'arrive pas à l'appliquer dans le code. Si quelqu'un a une idée, je le remerci d'avance.

@+

18 réponses

Oniria Messages postés 292 Date d'inscription dimanche 14 mars 2004 Statut Membre Dernière intervention 18 décembre 2014 3
31 juil. 2008 à 20:21
Bonjour,

moi, j'ai fait un petit programme plus universel  que voici:

unit test_choix;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Label1: TLabel;
    Memo1: TMemo;
    Button1: TButton;
    Button2: TButton;
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

var nombre : integer;
    tb,compt: array[0..10] of integer;

Function Choix(n,nb : integer): string;
var i,j,sortir,chiffre0 : integer;
    texte : string;
begin
     texte:='';
     chiffre0:=ord('0');
     for i:=0 to n-1 do tb[i]:=0; // On efface la réservation de la case
     if nb=0 then
        begin     // Si nb=0, on veut commencer au début
             for i:=0 to n-2 do compt[i]:=0; // On choisit la première solution
        end else
        begin     // nb<>0, on continu depuis la dernière valeur
             //On ajoute 1 au compteur
             j:=n-2;
             sortir:=0;
             repeat // Gestion de l'addition du compteur
                   compt[j]:=compt[j]+1;
                   if compt[j]>(n-1-j) then
                      begin
                           compt[j]:=0;
                           j:=j-1;
                      end else sortir:=1;
             until (j<0) or (sortir=1);
        end;
     // Sélection des nombres pour la sortie
     for i:=0 to n-2 do
         begin
              j:=0;
              sortir:=0;
              repeat
                    if Tb[j]=0 then sortir:=sortir+1;
                    j:=j+1;
              until (sortir-1)=compt[i]; // j-1 est le nombre choisit
              texte:=texte+chr(chiffre0+j);
              tb[j-1]:=1; // le chiffre à été choisit donc il ne sera plus repris
         end; // On vient de choisir les n-1 termes
     // On doit maintenant rechercher le seul qui n'a pas été utilisé
     i:=0;
     sortir:=0;
     repeat
           if tb[i]=0 then
              begin
                   texte:=texte+chr(chiffre0+i+1);
                   sortir:=1;
              end else i:=i+1;
     until sortir=1;
     Choix:=texte;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
     Form1.Close;
end;

procedure TForm1.Button1Click(Sender: TObject);
var txt,txt1 : string;
begin
     nombre:=strToint(Form1.Edit1.Text);
     txt:=Choix(nombre,0);
     Form1.Memo1.Lines.Add(txt);
     repeat
           txt1:=choix(nombre,1);
           if txt1<>'' then Form1.Memo1.Lines.Add(txt1);
     until (txt=txt1) or (txt1='');
//     Form1.Memo1.Lines.Add('Terminé');
end;

end.

Voila , si ca peut t'aider .

Oniria
1
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
31 juil. 2008 à 13:19
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
31 juil. 2008 à 19:39
voilà un petit code que j'ai écrit et qui me sers dans mes jeux :

procedure TFMain.Button1Click(Sender: TObject);
var
  i, j, k, l, m, n, nnpg, nnds, sto: integer;
  COMBI: array[1..28] of string;
begin
  nnds := 8;
  sto := 0;
  ListBox1.Clear;
  for i := 1 to nnds do
    for j := i to nnds do
      for k := j to nnds do
        for l := k to nnds do
          for m := l to nnds do
            for n := m to nnds do
              if ((i <> j) and (i <> k) and (i <> l) and (i <> m) and (i <> n))
                and ((j <> i) and (j <> k) and (j <> l) and (j <> m) and (j <> n))
                and ((k <> i) and (k <> j) and (k <> l) and (k <> m) and (k <> n))
                and ((l <> i) and (l <> j) and (l <> k) and (l <> m) and (l <> n))
                and ((m <> i) and (m <> j) and (m <> k) and (m <> l) and (m <> n)) then
              begin
                sto := sto + 1;
                COMBI6[sto] := IntToStr(i) + ';' + IntToStr(j)
                  + ';' + IntToStr(k) + ';' + IntToStr(l)
                  + ';' + IntToStr(m) + ';' + IntToStr(n);


                ListBox1.Items.Add(COMBI6[sto]);
              end
              else
                continue;
end;

A adapter bien sûr..

cantador
0
Frank_klein Messages postés 34 Date d'inscription samedi 26 mars 2005 Statut Membre Dernière intervention 8 février 2022
31 juil. 2008 à 21:16
je vais essayer de les  adapter, je vous tiendrais au courant, merci
0

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

Posez votre question
Oniria Messages postés 292 Date d'inscription dimanche 14 mars 2004 Statut Membre Dernière intervention 18 décembre 2014 3
31 juil. 2008 à 21:35
Bonjour,

je crois que je  vais devoir retourner à l'école :) Moi et les stats, j'ai vraiment du mal à comprendre. Mais bon quand j'ai fait ce code, j'avais besoin d'un système qui me donne toutes les solutions uniques avec X éléments possibles sans savoir que c'était des combinaisons ou arrangement ou autres...

Désolé, si j'ai confondu les deux. Mais bon si ça peut servir.

Oniria
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
31 juil. 2008 à 21:50
en fait, c'est simple, il y les combinaisons et les arrangements.
ex :
dans les combinaisons 4 parmi 4 cela donne 1 seule
ex: 1234
dans les arrangements,
il y en a : 4*3*2*1 = 24 arrangements possibles
tout dépend des besoins...
Je viens de voir qu'il y a même un un p'tit bug dans ton code car tu en trouves 25...(doublon 1234)

cantador
0
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
31 juil. 2008 à 23:27
Moi, je suis comme Oniria. J'ai toujours eu des difficultés avec ces trucs.  :)))

La prochaine fois qu'on en aura besoin, on demandera à Cantador...
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
1 août 2008 à 09:09
Tiens cari, voilà un lien :http://rfv.insa-lyon.fr/~jolion/STAT/node4.html

Interrogation écrite dans 3 jours !!
 
... avant que les choses ne passent de Caribe en Sylla..

cantador
0
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
1 août 2008 à 10:04
.... avant que les choses ne tombent de Charybde en Scylla !

L'orthographe compte ici aussi ! (oui je rentre de vacances en pleine forme)
http://fr.wikipedia.org/wiki/Charybde_et_Scylla

Voila voila. Et arrangez bien vos combinaisons dans leurs sous-ensembles !

Ressources Delphi, sources, tutoriaux, actu, ...: www.mx-dev.nethttp://te%3C/body
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
1 août 2008 à 10:48
salut flo..
oh tu sais les deux syntaxes semblent être acceptées...
et puis
CharybdeEnScylla au lieu de Caribensila..ça changerait tout CS !

et puis, le plus chiant des monstres c'était l'autre donc, il faudrait écrire :

ScyllaEnCharybde

une révolution..

cantador
0
Frank_klein Messages postés 34 Date d'inscription samedi 26 mars 2005 Statut Membre Dernière intervention 8 février 2022
1 août 2008 à 14:49
Bonjour cantador, le code que tu m'a proposé est très intéressant, je vais voir si j'arrive à l'adapter, je m'explique, par exemple j'ai besoin de combiner 8 numéros PREDEFINIS, avec un résultat de sortie sur 4. Le code que tu m’as proposé donne un résultat de sortie sur 6 avec huit numéros au hasard. déduction faite, il me semble qu'il faut faire autant des procédures que de choix de base à savoir que si je veux avoir une sortie sur 4 ou sur cinq je doit répéter le code et changer les variable et le nombre des lignes.

Question, y'a t-il un moyen pour éviter de répéter le code dans plusierus procedures et faire le tout dans une seule ? Merci encore une fois @+

PS. ne répondez pas à ce post si vous n'avez pas des idées concrètes se rapportant au sujet, cela poule plus le forum qu'autre chose. Merci<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??>
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
1 août 2008 à 15:58
Le code que tu m'as proposé donne un résultat de sortie sur 6 avec huit numéros au hasard.


C'est vrai, il ne fait que des combinaisons de 6, mais en revanche le nombre de numéros dans lesquelles elle sont crées est lui totalement libre (il suffit de changer les valeurs)



Question, y'a t-il un moyen pour éviter de répéter le code dans plusierus procedures et faire le tout dans une seule ?



Bonne question, eh bien figure toi que je comptais sur toi pour l'écrire !
déjà, t'as vu le bazar pour écrire à 6,
Imagine à 9..

Sérieusement, faudrait que j'y réfléchisse..

@+

cantador
0
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
1 août 2008 à 19:42
Oui y'a moyen !
Mon unité "super boucles" qui permet de générer des boucles imbriquées dynamiquement et sans connaître à l'avance le nombre de boucles ainsi que les bornes.

Je cherchais justement une utilité (autre que bruteforce) pour la poster: ce sera fait dès que possible !

Ressources Delphi, sources, tutoriaux, actu, ...: www.mx-dev.nethttp://te%3C/body
0
Frank_klein Messages postés 34 Date d'inscription samedi 26 mars 2005 Statut Membre Dernière intervention 8 février 2022
2 août 2008 à 00:57
Bonjour cantador,


Finalement ça m'arrange de garder une procédure pour chaque série de nombres
Tirés, j'ai réfléchit, je vais les mettre sur un événement de combobox,

là où je n'arrive pas c'est de permettre que les numéros soit pris parmi une série donnée, par exemple à partir d'un tableau remplit au prealable et au
choix,  exemple TAB_Comb : array[1..50] of integer,  TAB_Comb[1]:= 8; TAB_Comb[2]:=5 etc. 

donc des numéros qui ne sont pas prises au hasard, ensuite il faut que la procédure fasse les arrangements à partir de ces numéros que je vais renseigner à ma guise...

une idée ?
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
2 août 2008 à 11:00
hé, flo, je viens de mettre au point un programme complétement paramétrable..
et je comptais déposer le source..avant que je parte à la plage..sniff..

cantador
0
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
2 août 2008 à 11:37
Eh ben dépose-là !
Je suis sur que ton approche est plus élégante que la mienne.

A+ et bonne baignade
Flohttp://www.mx-dev.net
0
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
2 août 2008 à 18:41
Ouais, t'a parfaitement raison.
Le code de combi n'est pas le plus fameux, c'est pour cela qu'il y a aussi listes et arrangements. (et puis au moins ça permet à ceux qui n'ont toujours pas compris la différence de voir par eux mêmes)

Si ta version est plus ergonomique (y'a largement de quoi) ne te gènes surtout pas pour nous en faire part.

Mais c'est vrai que pour les joueurs (dont je ne fais pas parti), il vaut mieux jouer toutes les combinaisons que tous les arrangements ou listes ! C'est que ça en fait un paquet en moins !

Sur ce, j'attends ton MP...
++http://www.mx-dev.net
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
2 août 2008 à 23:35
une vie aussi après CS..

cantador
0
Rejoignez-nous