Forum de mathématiques - Bibm@th.net
Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
Pages : 1
Discussion fermée
#1 30-03-2019 11: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 13:41:22
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 16 989
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 - 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 :
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...
Hors ligne
#3 30-03-2019 15: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 14: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 18: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 18:17:29)
Hors ligne
#6 01-04-2019 19: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 20: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 20:42:59
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 16 989
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 :
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 :
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
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...
Hors ligne
#9 01-04-2019 21: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 17: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 17:30:58
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 16 989
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...
Hors ligne
#12 03-04-2019 19: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 17:29:08
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 16 989
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...
Hors ligne
#14 08-04-2019 21: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 21:19:23
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 16 989
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...
Hors ligne
#16 11-04-2019 07:35:46
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 16 989
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 :
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 :
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 :
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...
Hors ligne
Pages : 1
Discussion fermée