Comment calculer des combinaison [Résolu]

Frank_klein 34 Messages postés samedi 26 mars 2005Date d'inscription 8 avril 2011 Dernière intervention - 31 juil. 2008 à 12:15 - Dernière réponse : cs_cantador 4996 Messages postés dimanche 26 février 2006Date d'inscription 27 mars 2018 Dernière intervention
- 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 

22 réponses

Répondre au sujet
florenth 1105 Messages postés dimanche 1 août 2004Date d'inscription 17 août 2008 Dernière intervention - 2 août 2008 à 15:11
+3
Utile
Et voila que ma version arrive ici :
http://www.delphifr.com/codes/GENERATEUR-COMBINAISONS-LISTES-ARRANGEMENTS-ENTIEREMENT-PARAMETRABLE-REUTILISABLE_47483.aspx

Et toi Cantador, ça arrive ou bien t'es déjà dans l'eau http://www.mx-dev.net
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de florenth
Caribensila 2671 Messages postés jeudi 15 janvier 2004Date d'inscription 18 janvier 2018 Dernière intervention - 31 juil. 2008 à 13:19
0
Utile
Salut,

Ca devrait t'aider.
Commenter la réponse de Caribensila
cs_cantador 4996 Messages postés dimanche 26 février 2006Date d'inscription 27 mars 2018 Dernière intervention - 31 juil. 2008 à 19:39
0
Utile
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
Oniria 297 Messages postés dimanche 14 mars 2004Date d'inscription 18 décembre 2014 Dernière intervention - 31 juil. 2008 à 20:21
0
Utile
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
Commenter la réponse de Oniria
Frank_klein 34 Messages postés samedi 26 mars 2005Date d'inscription 8 avril 2011 Dernière intervention - 31 juil. 2008 à 21:16
0
Utile
je vais essayer de les  adapter, je vous tiendrais au courant, merci
Commenter la réponse de Frank_klein
Oniria 297 Messages postés dimanche 14 mars 2004Date d'inscription 18 décembre 2014 Dernière intervention - 31 juil. 2008 à 21:35
0
Utile
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
cs_cantador 4996 Messages postés dimanche 26 février 2006Date d'inscription 27 mars 2018 Dernière intervention - 31 juil. 2008 à 21:50
0
Utile
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
Caribensila 2671 Messages postés jeudi 15 janvier 2004Date d'inscription 18 janvier 2018 Dernière intervention - 31 juil. 2008 à 23:27
0
Utile
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
cs_cantador 4996 Messages postés dimanche 26 février 2006Date d'inscription 27 mars 2018 Dernière intervention - 1 août 2008 à 09:09
0
Utile
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
florenth 1105 Messages postés dimanche 1 août 2004Date d'inscription 17 août 2008 Dernière intervention - 1 août 2008 à 10:04
0
Utile
.... 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
cs_cantador 4996 Messages postés dimanche 26 février 2006Date d'inscription 27 mars 2018 Dernière intervention - 1 août 2008 à 10:48
0
Utile
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
Frank_klein 34 Messages postés samedi 26 mars 2005Date d'inscription 8 avril 2011 Dernière intervention - 1 août 2008 à 14:49
0
Utile
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
cs_cantador 4996 Messages postés dimanche 26 février 2006Date d'inscription 27 mars 2018 Dernière intervention - 1 août 2008 à 15:58
0
Utile
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
florenth 1105 Messages postés dimanche 1 août 2004Date d'inscription 17 août 2008 Dernière intervention - 1 août 2008 à 19:42
0
Utile
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
Frank_klein 34 Messages postés samedi 26 mars 2005Date d'inscription 8 avril 2011 Dernière intervention - 2 août 2008 à 00:57
0
Utile
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
cs_cantador 4996 Messages postés dimanche 26 février 2006Date d'inscription 27 mars 2018 Dernière intervention - 2 août 2008 à 11:00
0
Utile
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
florenth 1105 Messages postés dimanche 1 août 2004Date d'inscription 17 août 2008 Dernière intervention - 2 août 2008 à 11:37
0
Utile
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
cs_cantador 4996 Messages postés dimanche 26 février 2006Date d'inscription 27 mars 2018 Dernière intervention - 2 août 2008 à 15:38
0
Utile
TA TA TA !



chuis pas encore dans l'eau..parce si tu étais joueur

tu perdrais du pognon..





parce que les listes et les arrangements on s'en fout !

mais t'as fait les combinaisons et elles marchent super bien !
bravo florenth !

je me suis concentré sur les combins, c'est çà le + intéressant..
mon programme les traite de manière plus ergonomique..
Tiens au fait, j'aimerais qu'on travaille ensemble un programme qui serait
une suite à cette étude sur laquelle je bloque.
je t'expliquerais le truc par MP.
@+

cantador
Commenter la réponse de cs_cantador
florenth 1105 Messages postés dimanche 1 août 2004Date d'inscription 17 août 2008 Dernière intervention - 2 août 2008 à 18:41
0
Utile
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
Frank_klein 34 Messages postés samedi 26 mars 2005Date d'inscription 8 avril 2011 Dernière intervention - 2 août 2008 à 23:11
0
Utile
merci pour ton aide florenth, j'ai pu résoudre le problème des combinaisons grâce à ton code, il est très bien, je pense que ça peut servir à beaucoup de projets, le tout est de l'adapter, bon y'a quelques bricoles sur le try à mettre en place, pour ma part j'utilise des boutons radios à la place de la stringgrid..., ce qui me manquait pour résoudre le problème avec le code de cantador sur le choix prédéterminé des nombres c'était l'évaluation de la minima et de la maxima du tableau, ce sont des trucs à savoir  on ne peut pas les inventer, j'aimerais voir sa version aussi mais bon s'il n'y a pas de moyen tant pis.A bientôt <?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??>
Commenter la réponse de Frank_klein

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Comment calculer des combinaison - page 2