Bibm@th

Forum de mathématiques - Bibm@th.net

Bienvenue dans les forums du site BibM@th, des forums où on dit Bonjour (Bonsoir), Merci, S'il vous plaît...

Vous n'êtes pas identifié(e).

#1 30-03-2019 10:06:40

bidibulle63
Membre
Inscription : 30-03-2019
Messages : 7

Combinaisons de numéros

Combinaisons au jeu du Keno

Nombre de Numéros : 70
916 895 combinaisons de 4N°

Je recherche le numéro d'une combinaison sachant que :
   1-2-3-4   --> N°1
   1-2-3-70  --> N°68
   1-2-4-5   --> 69
   1-2-4-70  --> 133
   1-2-5-6   --> 134 etc,etc,etc...

Autres exemples ( si pas d'erreur) :
   1-30-31-32  --> 41 735
   1-68-69-70  --> 52 394
   2-3-4-5     --> 52 395

Je recherche donc une formule qui pourrait me donner ces numéros en fonction bien sur des 4N°
ou un algorithme si une formule n'est pas possible.

Je préferai une formule car c'est pour faire avec Visual Studio donc Visual Basic.

Merci d'avance et si vous trouvez, pouvez-vous faire la même chose pour 5N° voir éventuellement 6N°.

Hors ligne

#2 30-03-2019 12:41:22

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 947

Re : Combinaisons de numéros

Salut

Si j'ai bien compris, tes nos de keno étant rangés en ordre croissant, à partir d'une combinaison, tu veux retrouver son n° ordre.
J'ai fait les tests, je ne suis pas toujours d'accord avec ce que tu as annoncé :

Combinaison recherchée :  1 -  2 -  3 -  4 N° annoncé !      1   N° trouvé :      1
Combinaison recherchée :  1 -  2 -  3 - 70 N° annoncé :     68   N° trouvé :     67
Combinaison recherchée :  1 -  2 -  4 -  5 N° annoncé :     69   N° trouvé :     68
Combinaison recherchée :  1 -  2 -  4 - 70 N° annoncé :    133   N° trouvé :    133
Combinaison recherchée :  1 -  2 -  5 -  6 N° annoncé :    134   N° trouvé :    134
Combinaison recherchée :  1 - 30 - 31 - 32 N° annoncé :  41375   N° trouvé :  41735
Combinaison recherchée :  1 - 68 - 69 - 70 N° annoncé :  52394   N° trouvé :  52394
Combinaison recherchée :  2 -  3 -  4 -  5 N° annoncé :  52395   N° trouvé :  52395

Autres exemples :
5 - 6 - 7 - 12  n° --> 196180
31 - 43 - 55 - 68  n° --> 831612

C'est ça que tu veux ?
Alors, je l'ai fait en Python en 5 min :

keno=[(0,0,0,0)]
for i in range(1,68):
    for j in range(i+1,69):
        for k in range(j+1,70):
            for l in range(k+1,71):
                keno.append((i,j,k,l))

4 boucles imbriquées et à l'intérieur de la 4e je stocke la combinaison  i - j - k - l sous la forme (i,j,k,l) dans une liste que j'ai appelée... keno.

Ensuite, je lance le script.
Une fois en mémoire, je n'ai plus qu'à taper :
keno.index((31,43,55,68))
je valide et j'ai la réponse : 831612...

Je vais voir si je peux trouver une formule...

@+


Arx Tarpeia Capitoli proxima...

En ligne

#3 30-03-2019 14:20:28

bidibulle63
Membre
Inscription : 30-03-2019
Messages : 7

Re : Combinaisons de numéros

Comme j'ai un très grand nombre de fois à calculer ce numéro, je pensais que des boucles ce serai trop long mais j'ai fait ta méthode et

ça a l'air impeccable.Je ne gagnerai surement pas grand chose avec une formule mais c'était pour le Fun.

Grand merci à toi.

Hors ligne

#4 01-04-2019 13:28:07

bidibulle63
Membre
Inscription : 30-03-2019
Messages : 7

Re : Combinaisons de numéros

J'ai beaucoup trop d'accès disque,non il me faut une formule.

Hors ligne

#5 01-04-2019 17:16:43

bidibulle63
Membre
Inscription : 30-03-2019
Messages : 7

Re : Combinaisons de numéros

Voila comment je trouve les numéros en VBA mais c'est beaucoup trop long:
    A = 6: B = 7: C = 8: D = 9
    Numero = 0
    For p1 = 1 To 67
    For p2 = p1 + 1 To 68
    For p3 = p2 + 1 To 69
    For p4 = p3 + 1 To 70
        Numero = Numero + 1
        If p1 = A And p2 = B And p3 = C And p4 = D Then
             MsgBox (Numero)
             Exit Sub
        End If
    Next p4
    Next p3
    Next p2
    Next p1
Je cherche une formule d'aprés les relations ci-dessous mais je ne suis pas assez calé en maths pour trouver

                            71-4=  71-5=     etc...
                    M-N=    67    66    65

          X-Y=      2 278        2 211    2 145    2 080
                      M               N
              52 394    50 116    47 905   45 760          43 680
               X                Y           
                                               
A            1          2          3             4          5         6   
B          2          3          4             5          6         7   
C          3          4          5             6          7         8   
D          4          5          6             7          8         9   
                                               
Numéro     1    52 395       102 511      150 416      196 176      239 856

Dernière modification par bidibulle63 (01-04-2019 17:17:29)

Hors ligne

#6 01-04-2019 18:55:44

freddy
Membre chevronné
Lieu : Paris
Inscription : 27-03-2009
Messages : 7 457

Re : Combinaisons de numéros

Salut,

c'est trop long car il faut que tu optimises ton code.
Par exemple, p1 doit aller de 1 à A, inutile d'aller plus loin.
Ensuite, tu fais un calcul "force brute", faut chercher à être un peu plus malin.
Pas facile, je sais, mais ce qui ralentit ton code est le test que tu fais faire à chaque étape, et donc, ça prend du temps.
A suivre ...


De la considération des obstacles vient l’échec, des moyens, la réussite.

Hors ligne

#7 01-04-2019 19:00:29

freddy
Membre chevronné
Lieu : Paris
Inscription : 27-03-2009
Messages : 7 457

Re : Combinaisons de numéros

Ensuite, il faut que tu fasses un calcul sur Excel en créant une fonction particulière pour donner les rangs des numéros que tu cherches.
Tu gagneras un peu de temps aussi, tu n'auras pas à relancer chaque fois le programme.


De la considération des obstacles vient l’échec, des moyens, la réussite.

Hors ligne

#8 01-04-2019 19:42:59

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 947

Re : Combinaisons de numéros

Salut,

J'y réfléchis toujours, mais pour l'instant, rien de concret...
Chez moi, et pourtant Python est réputé lent (et VB très rapide), le fichier keno avec ses 916895 entrées est prêt en moins d'1 s...
L'accès au n° d"ordre de la combinaison est instantané...
Je ne comprends pas pourquoi tu as des des accès disque...
Ce que j'ai fait était uniquement dans le but de savoir si ce que j'avais compris ce que tu voulais et pas pour être utilisé tel quel.
Depuis j'en avais fait une fonction :

def kenindex():
    keno=[(0,0,0,0)]
    for i in range(1,68):
        for j in range(i+1,69):
            for k in range(j+1,70):
                for l in range(k+1,71):
                    keno.append((i,j,k,l))
    return keno

keno=kenindex()

J'appelle la fonction en récupérant le tableau construit le tableau une fois pour toutes...
Je lance le script.
Puis le tableau keno étant en mémoire, en mode console, je l'appelle autant de fois que je  veux sans avoir à le reconstruire à chaque fois :

>>> keno.index((7,8,25,67))
282417
>>> keno.index((13,14,15,16))
492626
>>> keno.index((23,34,45,56))
731076
>>>

Je vais aller jeter un œil sur les docs du VB...

Bon :
1.  Il faut déclarer ton tableau
    Dim keno(916896) As Integer
    et probablement un 2e :
     Dim kenum(916896) As Integer

2. Entrer le 1er élément : keno(0)=(0,0,0,0)
3. Construire le tableau complet via une fonction

Function kenindex[] As ReturnType
    Numero = 0
    For p1 = 1 To 67
        For p2 = p1 + 1 To 68
            For p3 = p2 + 1 To 69
                For p4 = p3 + 1 To 70
                    Numero = Numero + 1
                    keno(Numero)=(p1,p2,p3,p4)
                Next p4
            Next p3
        Next p2
    Next p1
Return keno
End Function

kenum=kenindex[]

Après tu exécutes le code une fois....
Et tu demandes l'affichage de IndexOf(kenum,(13,14,15,16))


Mais là, je suis face à beaucoup de suppositions pas sûr que ça marche...
Sinon tu récupères Python : je t'en propose une version qui s'installe vite : on crée un dossier Python et on dépose le fichier téléchargé dedans, on le lance, il installe Python.
Tu entres dans le dossier WinPython...
Là si tu as un système 32 bits, tu auras un nouveau dossier
nommé WinPython-32bit-3.5.1.2Zero
ou si tu as un système 64 bits, tu auras un nouveau dossier
nommé WinPython-64bit-3.5.1.2Zero
Le fichier est à télécharger ici :
https://sourceforge.net/projects/winpyt … 5/3.5.1.2/
Entre dans ce nouveau dossier.
Reste alors plus qu'à lancer Python
L'interface la plus simple s'obtient par double clic sur IDLEX (Python GUI).exe
C'est la fenêtre console interactive.
Clique sur File puis sur New File.
La fenêtre qui s'ouvre est celle où tu vas coller le petit morceau de code Python du début.
Cela fait.
Tu appuies sur F5 : tu lui donnes un nom il s'enregistre et s'exécute.
Tu te retrouves dans la première fenêtre :

Python 3.5.1 (v3.5.1:37a07cee5969, Dec  6 2015, 01:54:25) [MSC v.1900 64 bit (AMD64)] on win32
Type "copyright", "credits" or "license()" for more information.
>>>
RESTART: C:/WinPython/WinPython-64bit-3.5.1.2Zero/python-3.5.1.amd64/Scripts/keno.py
>>> |

La barre est le curseur clignotant...
Et tu tapes par ex : keno.index((3,45,54,63)) suivi de Entree et tu vois :
>>> keno.index((3,45,54,63))
147988
Et tu peux recommencer autant de fois que tu veux :
>>> keno.index((13,14,44,45))
493815
>>> keno.index((1,3,5,7))
2346
>>> keno.index((11,13,15,17))
430971
>>> keno.index((31,43,55,68))
831612
>>> |

Je viens de tester tout cette procédure : pas de pb.

Je continue la recherche d'une formule...


@+


Arx Tarpeia Capitoli proxima...

En ligne

#9 01-04-2019 20:49:35

freddy
Membre chevronné
Lieu : Paris
Inscription : 27-03-2009
Messages : 7 457

Re : Combinaisons de numéros

Hello,

beau travail, yoshi !
Sinon, sur le code de notre ami, il faut je pense intégrer un While ou bien un Until pour que les boucles imbriquées fassent le job jusqu'au bon moment, sans tester pas à pas, c'est ça qui est chronophage.


De la considération des obstacles vient l’échec, des moyens, la réussite.

Hors ligne

#10 02-04-2019 16:30:21

bidibulle63
Membre
Inscription : 30-03-2019
Messages : 7

Re : Combinaisons de numéros

Merci yoshi.
ta solution est trés bien .
En VBA cela fonctionne:
    Dim Keno(67, 68, 69, 70), Numero As Long (mém. importante(22 005 480) pour 4N° ok mais pas 5)
    For p1 = 1 To 67
      For p2 = p1 + 1 To 68
        For p3 = p2 + 1 To 69
          For p4 = p3 + 1 To 70
            Numero = Numero + 1
            Keno(p1, p2, p3, p4) = Numero
          Next p4
        Next p3
      Next p2
    Next p1
mais je ne trouve pas pour convertir   keno(Numero)=(p1,p2,p3,p4)    en VBA qui ne prend que 916 895.
Merci aussi pour Python mais vu que je ne suis pas un grand programmeur, je reste sur Vba.
je suis donc toujours à la recherche d'une solution.

Hors ligne

#11 02-04-2019 16:30:58

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 947

Re : Combinaisons de numéros

Re,

Merci M'sieu...
Ce qui est chronophage surtout c'est qu'à chaque recherche d'index, il est obligé de reconstruire son ensemble.
Mais trouver une formule, pas de la tarte...
Même si les postions peuvent être déduites des [tex]C_p^n[/tex] :
(1,2,69,70) index 2278
Donc
de (1,2,3,4) à (1,2,69,70) il y a 2278 quadruplets
[tex]C_{2}^{68}=2278[/tex]
Mais c'est aussi $\dfrac{67(67+1)}{2}$

De (1,3,4,5) à (1,3,69,70) il y a  $\dfrac{66(66+1)}{2}=2211$ quadruplets

De (1,4,5,6) à (1,2,69,70) il y a  $\dfrac{65(65+1)}{2}=2145$ quadruplets

Je ne sais pas où ça va mener, mais je crois que c'est une piste...

@+


Arx Tarpeia Capitoli proxima...

En ligne

#12 03-04-2019 18:36:15

bidibulle63
Membre
Inscription : 30-03-2019
Messages : 7

Re : Combinaisons de numéros

Grand Merci Yoshi
Grace a ta 1ére idée, j'ai trouvé l'identique en VBA:

    Dim lst As New List(Of Decimal)
    For p1 = 1 To 67
      For p2 = p1 + 1 To 68
        For p3 = p2 + 1 To 69
          For p4 = p3 + 1 To 70

            lst.Add(p1 & p2 & p3 & p4)

          Next p4
        Next p3
      Next p2
    Next p1
   
    lst.IndexOf("1111824")   '--> 18513

A voir s'il n'y a pas d'erreur avec des N° accollés  sinon je passerai en Dim lst As New List(Of String).
J'ai testé, ça marche aussi.
C'est ok aussi pour 5 N° mais Dépassement de mémoire pour 6 N° donc ..... formule.

Hors ligne

#13 08-04-2019 16:29:08

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 947

Re : Combinaisons de numéros

Bonjour,

Je réfléchis toujours, mais j'avance...
C'est très compliqué à établir.
Par exemple pour savoir combien de n°s, il y a entre (1,2;3,4) et (1,68,69,70)
Je n'ai plus besoin de calculer la liste de toutes les combinaisons (keno)
avec n=67
Je tape n*(n+1)*(2n+1)/6  --> 52294

Mais je peux calculer Entre (1,2,3,4) et (par ex) (1,15,69,70)
Je prends n=67 et k=67-(15-2+1)=67 - 14 = 53
Le nombre de nos cherchés est
n*(n+1)*(n+2)/6 -k*(k+1)*(k+2)/6 = 26159

Et si je demande keno.index(1,15,69,70), j'obtiens... 26159
Reste
1. A retrouver l'index de quel n'importe quel  n° entre (1, 16, 17, 18) et  (1, 16, 69, 70) : je vais trouver, je n'en suis pas loin.
2. A regarder ce qui se passe pour tous les nos ne commençant plus par 1, mais par 2...
3. Ensuite 3, 4, 5... et j'aurais une idée de l'évolution des formules déjà trouvées

@+


Arx Tarpeia Capitoli proxima...

En ligne

#14 08-04-2019 20:03:07

bidibulle63
Membre
Inscription : 30-03-2019
Messages : 7

Re : Combinaisons de numéros

Bonsoir,
Moi, je fais des recherches en passant par les Modulo, les Entiers ou autres, mais pas évident.
A +

Hors ligne

#15 08-04-2019 20:19:23

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 947

Re : Combinaisons de numéros

Rez,

Encore une avancée ce soir :
De (1, 16, 17, 18) à  (1, 16, 69, 70)
il y a $\dfrac{53\times 54}{2}=53 \times 27 = 1431$ numéros
Et 53 = 69-17+1
+1 parce que si de 2 à 5 (par ex)  5-2 = 3, pourtant  2, 3, 4, 5  --> 4 numéros, c'est le coup des piquets et des intervalles...

@+


Arx Tarpeia Capitoli proxima...

En ligne

#16 11-04-2019 06:35:46

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 947

Re : Combinaisons de numéros

Bonjour,

J'ai franchi la première étape : je retrouve l'index de n'importe quelle série entre 1,2,3,4 et 1,68,69,70.
Prochaine étape :  séries commençant par 2.


def position(a,b,c,d):
    cc,dd,c=c,d,b+1
    d=b+2
    n,k=67,67-(b-2)
    pos1=(n*(n+1)*(n+2)-k*(k+1)*(k+2))//6+1
    print("Position de            "+str(a)+", "+str(b)+", "+str(c)+", "+str(d),": %5i" % pos1)
    # Etape 2
    a1,b1,c1,d1=a,b,cc,cc+1
    n,k=70-c,70-c1
    ecart1=((n-k)*(n+k+1))//2
    print ("Correction jusqu'à     "+str(a1)+", "+str(b1)+", "+str(c1)+", "+str(d1),": %5i" % ecart1)
    #Etape 3
    ecart2=dd-d1
    print ("Correction finale pour "+str(a1)+", "+str(b)+", "+str(cc)+", "+str(dd),": %5i" % ecart2)
    print()                  
    return (pos1+ecart1+ecart2)

a,b,c,d=1,31,37,52
print("L'index de : "+str(a)+", "+str(b)+", "+str(c)+", "+str(d)+" est :", position(a,b,c,d))
 

@+
Et j'obtiens :

Position de            1, 31, 32, 33 : 42515
Correction jusqu'à     1, 31, 37, 38 :   180
Correction finale pour 1, 31, 37, 52 :    14
Ll'index de : 1, 31, 37, 52 est : 42709

Avec a,b,c,d=1,28,37,45 :

Position de            1, 28, 29, 30 : 40054
Correction jusqu'à     1, 28, 37, 38 :   300
Correction finale pour 1, 28, 37, 45 :     7

L'index de : 1, 28, 37, 45 est : 40361

Avec  1,37,53,65 :

Position de            1, 37, 38, 39 : 46411
Correction jusqu'à     1, 37, 53, 54 :   375
Correction finale pour 1, 37, 53, 65 :    11

L'index de : 1, 37, 53, 65 est : 46797

@+


Arx Tarpeia Capitoli proxima...

En ligne

Pied de page des forums