Comment calculer des combinaison [Résolu]

Messages postés
34
Date d'inscription
samedi 26 mars 2005
Statut
Membre
Dernière intervention
8 avril 2011
- - Dernière réponse : cs_cantador
Messages postés
4716
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
27 mars 2018
- 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.

@+
Afficher la suite 

18 réponses

Meilleure réponse
Messages postés
296
Date d'inscription
dimanche 14 mars 2004
Statut
Membre
Dernière intervention
18 décembre 2014
2
1
Merci
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

Dire « Merci » 1

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 220 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Oniria
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
13
0
Merci
Salut,

Ca devrait t'aider.
Commenter la réponse de Caribensila
Messages postés
4716
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
27 mars 2018
9
0
Merci
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
Commenter la réponse de cs_cantador
Messages postés
34
Date d'inscription
samedi 26 mars 2005
Statut
Membre
Dernière intervention
8 avril 2011
0
Merci
je vais essayer de les  adapter, je vous tiendrais au courant, merci
Commenter la réponse de Frank_klein
Messages postés
296
Date d'inscription
dimanche 14 mars 2004
Statut
Membre
Dernière intervention
18 décembre 2014
2
0
Merci
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
Commenter la réponse de Oniria
Messages postés
4716
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
27 mars 2018
9
0
Merci
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
Commenter la réponse de cs_cantador
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
13
0
Merci
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...
Commenter la réponse de Caribensila
Messages postés
4716
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
27 mars 2018
9
0
Merci
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
Commenter la réponse de cs_cantador
Messages postés
1023
Date d'inscription
dimanche 1 août 2004
Statut
Membre
Dernière intervention
17 août 2008
0
Merci
.... 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
Commenter la réponse de florenth
Messages postés
4716
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
27 mars 2018
9
0
Merci
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
Commenter la réponse de cs_cantador
Messages postés
34
Date d'inscription
samedi 26 mars 2005
Statut
Membre
Dernière intervention
8 avril 2011
0
Merci
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" /??>
Commenter la réponse de Frank_klein
Messages postés
4716
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
27 mars 2018
9
0
Merci
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
Commenter la réponse de cs_cantador
Messages postés
1023
Date d'inscription
dimanche 1 août 2004
Statut
Membre
Dernière intervention
17 août 2008
0
Merci
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
Commenter la réponse de florenth
Messages postés
34
Date d'inscription
samedi 26 mars 2005
Statut
Membre
Dernière intervention
8 avril 2011
0
Merci
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 ?
Commenter la réponse de Frank_klein
Messages postés
4716
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
27 mars 2018
9
0
Merci
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
Commenter la réponse de cs_cantador
Messages postés
1023
Date d'inscription
dimanche 1 août 2004
Statut
Membre
Dernière intervention
17 août 2008
0
Merci
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
Commenter la réponse de florenth
Messages postés
1023
Date d'inscription
dimanche 1 août 2004
Statut
Membre
Dernière intervention
17 août 2008
0
Merci
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
Commenter la réponse de florenth
Messages postés
4716
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
27 mars 2018
9
0
Merci
une vie aussi après CS..

cantador
Commenter la réponse de cs_cantador