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 13-03-2012 12:11:45

erichof
Membre
Inscription : 26-08-2011
Messages : 29

jeu

Bonjour,
A l'aide d'un tableur, comment peut-on simuler le loto (cochage de 7 numéros parmi 49 ou tirage de 7 boules distinctes parmi 49) ?
Avoir un nombre entier aléatoire entre 1 et 49 est facile à simuler mais le fait que les 7 trirages soient distincts me pose problème.
Merci pour votre aide.
Cirdéco
PS : ou alors faut-il passer absolument par un algorithme applicable avec ALGOBOX par exemple ?

Hors ligne

#2 13-03-2012 14:27:32

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 17 401

Re : jeu

Bonjour,

Avoir un nombre entier aléatoire entre 1 et 49 est facile à simuler mais le fait que les 7 tirages soient distincts me pose problème.

Qu'entends-tu par "tirages distincts" ?
Tu ne veux pas 7 fois le même tirage de loto, c'est évident, mais peut-être veux-tu dire que tu ne veux pas 7 fois le même nombre ?
Hmmm... Je n'ai pas vérifié : Est-il possible de tirer dans un ensemble précis ?
Sinon, je te propose ça  (en Python, c'est facile à faire) qui devrait marcher..
Au départ, on écrit les 49 nombres de A1 à A49.
On tire au sort le n° de ligne.
la première fois n° de ligne et nombre coïncident.
Après, c'est là que ça se gâte, il faut faire réécrire par le tableur 48, lignes, puis 47, puis 46 en supprimant à chaque fois la ligne tirée au sort.

En Python donc :

#!/usr/bin/env python
# -*- coding: CP1252 -*-

from random import randrange
dispos=range(1,50)
print "Nos des boules dans l'urne :"
print dispos
print
print "Tirage :"
for i in range(7):
    case=randrange(1,50-i)
    nombre = dispos[case-1]
    del dispos[case-1]
    print nombre,

print
print
print "Nos des boules encore dans l'urne :"
print dispos
print

Je commence par créer un liste de 49 numéros (rangés dans les cases d'index 0 à 48 : la numérotation en Python commence à 0).
Et mon principe : à chaque tour je supprime le nombre tiré, donc je fais des tirages successifs sur 49, 48, 47, 46.... nombres

7 fois de suite, je répète la même opération, je tire au sort, pour i =0 jusqu'à 6 donc, un n° de case compris entre 0 et 49-i (En python la borne supérieure est exclue pour tirer entre 1 et 49, je dois indiquer 50 ; et 50 - i parce qu'à chaque tour le nb de cases diminue de 1 et le n° de case à tirer se trouve donc être à chercher entre 1 et 49-i (noté 50-i puisque la borne 50-i est exclue)

Si je tire la 6e case, non index est 5 d'où le case-1 et le nombre cherché est celui qui se trouve dans la case d'index n° case -1
Et je supprime enfin ce nombre.
Voilà quelques sorties :

Nos des boules dans l'urne :
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49]

Tirage :
20 18 34 24 49 40 17

Nos des boules encore dans l'urne :
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 19, 21, 22, 23, 25, 26, 27, 28, 29, 30, 31, 32, 33, 35, 36, 37, 38, 39, 41, 42, 43, 44, 45, 46, 47, 48]

>>> ================================ RESTART ================================
>>>
Nos des boules dans l'urne :
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49]

Tirage :
41 35 26 24 29 14 40

Nos des boules encore dans l'urne :
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19, 20, 21, 22, 23, 25, 27, 28, 30, 31, 32, 33, 34, 36, 37, 38, 39, 42, 43, 44, 45, 46, 47, 48, 49]

>>> ================================ RESTART ================================
>>>
Nos des boules dans l'urne :
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49]

Tirage :
46 14 8 28 47 49 26

Nos des boules encore dans l'urne :
[1, 2, 3, 4, 5, 6, 7, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 27, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 48]

Quand je jouais au loto, je tirais au sort un n° de case de départ dans mon carré magique "diabolique" (=pandiagonal) d'ordre 7 et je prenais 7 nombres consécutifs à partir de là...

Bon, je n'ai jamais rien gagné ! ;-)

@+

Hors ligne

#3 13-03-2012 21:15:49

Fred
Administrateur
Inscription : 26-09-2005
Messages : 7 352

Re : jeu

Salut,

  Je crois que le tableur "seul" n'est pas très adapté au tirage du loto, ou plus généralement aux tirages sans remise. On doit pouvoir bidouiller quelque chose pour que cela fonctionne, ou encore utilisé le langage de programmation sous-jacent, mais ce n'est pas le moyen le plus naturel.
Le vrai moyen naturel, c'est plutôt d'utiliser un langage de programmation de type 'Algobox'.

Fred.

Hors ligne

#4 13-03-2012 21:30:12

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 17 401

Re : jeu

Bonsoir,

Je suis allé voir...
Marrant et intéressant. Libre et gratuit de surcroît !
Ce que je fais avec Python, doit pouvoir être fait de façon "naturelle" avec AlgoBox qui évite l'apprentissage d'un langage avec toutes les erreurs de syntaxe à la clé...
On dirait de l'ALGOL langage que j'ai vu en Fac, il y a plus de 40 ans... avec le côté interactif en plus : on rédigeait nos prog et on attendait une semaine pour avoir le résultat !

@+

Hors ligne

#5 13-03-2012 22:26:14

Fred
Administrateur
Inscription : 26-09-2005
Messages : 7 352

Re : jeu

Re-

  C'est une idée extrêmement intéressante...
Je ne sais pas ce que cela donne en classe.

Fred.

Hors ligne

#6 14-03-2012 08:56:18

cirdec
Invité

Re : jeu

Bonjour,
Merci beaucoup pour la programmation avec Python, c'est exactement ce que je souhaitais.
Si quelqu'un a cependant la version transposée sur ALGOBOX, je suis preneur.
Cordialement,
Cédric

#7 14-03-2012 21:48:34

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 17 401

Re : jeu

Bonsoir,

Je vais télécharger AlgoBox et voir comment faire une transposition rétrograde de mon prog Python vers AlgoBox...


@+

Hors ligne

#8 15-03-2012 17:33:53

totomm
Membre
Inscription : 25-08-2011
Messages : 1 093

Re : jeu

Bonjour,

Il est possible de simuler le tirage du loto sur un tableur ( OpenOffice.calc)
En utilisant simplement les formules disponibles ( et non pas le langage de programmation sous jacent)
Par exemple tirage (sans remise) de 7 boules distinctes parmi 49

Remplir A1:A7 des valeurs 49, 48,….,43 (Utiliser Edition/Remplir/Série)
En B1 insérer la formule : =ENT((ALEA()*A1)+1) et recopier (glisser) jusqu'en B7
En C1 mettre 0
En C2 insérer la formule : ="<=" & CTXT(B2;0) et recopier (glisser) jusqu'en C7
Dans cette colonne C se trouve le critère qui assure la non-remise des tirages
En D1 mettre 0
En D2 insérer la formule : =NB.SI(B$1:B1;C2) et recopier (glisser) jusqu'en D7
Enfin en E1 insérer la formule : =B1+D1 et recopier (glisser) jusqu'en E7
Les 7 tirages sans remise sont en colonne E

ALGOBOX me laisse perplexe. Quand on dispose de PYTHON...
Mais je ne me risquerai pas à discuter de la pédagogie dans l'initiation à l'algorithmique...

Cordialement

Hors ligne

#9 15-03-2012 22:10:28

Fred
Administrateur
Inscription : 26-09-2005
Messages : 7 352

Re : jeu

Bonne idée... Il m'a fallu un peu de temps pour me convaincre que c'était effectivement un vrai tirage de loto (tous les nombres tirés au second tirage sont équiprobables).

F.

Hors ligne

#10 16-03-2012 13:28:28

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 17 401

Re : jeu

Bonjour,

Voilà, c'est fait...
Mais, pas sûr du tout que la procédure employée soit la bonne : je ne n'ai fait que traduire, dans la douleur, mon script Python...

Ce joujou est bien joli, mais il ne faut pas trop lui en demander : il est très très vite très très très limité.
Je n'ai pas trouvé notamment :
- comment supprimer un élément d'une liste,
- comment, en cas d'affichage sur la même ligne, laisser une espace
- comment laisser une ligne vide

J'ai donc usé d'expédients (grâce à l'expérience de la programmation !) :
- Suppression : si je veux supprimer l'enregistrement n° 9 (par ex), je décale les contenus des enregistrements d'un rang vers l'arrière :
10 --> 9, 11 --> 10, 12 --> 11 et je remplace le dernier de la liste par 0 (zéro).
- affichage même ligne : j'opte pour afficher le message " - " sans retour à la ligne jusqu'à l'avant-dernier nombre
- saut de ligne : j'affiche 2 messages consécutifs constitués d'espaces avec retour à la ligne


1     VARIABLES
2       i EST_DU_TYPE NOMBRE
3       j EST_DU_TYPE NOMBRE
4       casier EST_DU_TYPE NOMBRE
5       nbre EST_DU_TYPE NOMBRE
6       dispos EST_DU_TYPE LISTE
7     DEBUT_ALGORITHME
8       POUR i ALLANT_DE 1 A 49
9         DEBUT_POUR
10        dispos[i] PREND_LA_VALEUR i
11        FIN_POUR
12      AFFICHER "Tirage :"
13      POUR i ALLANT_DE 0 A 6
14        DEBUT_POUR
15        casier PREND_LA_VALEUR ALGOBOX_ALEA_ENT(1,49-i)
16        nbre PREND_LA_VALEUR dispos[casier]
17        AFFICHER nbre
18        SI (i<6) ALORS
19          DEBUT_SI
20          AFFICHER "-"
21          FIN_SI
22        POUR j ALLANT_DE 1 A 48-i
23          DEBUT_POUR
24          SI (j>=casier) ALORS
25            DEBUT_SI
26            dispos[j] PREND_LA_VALEUR dispos[j+1]
27            FIN_SI
28          FIN_POUR
29        dispos[49-i] PREND_LA_VALEUR 0
30        FIN_POUR
31      AFFICHER " "
32      AFFICHER " "
33      AFFICHER "Nos des boules toujours dans l'urne :"
34      POUR i ALLANT_DE 1 A 42
35        DEBUT_POUR
36        AFFICHER dispos[i]
37        SI (i<42) ALORS
38          DEBUT_SI
39          AFFICHER "-"
40          FIN_SI
41        FIN_POUR
42    FIN_ALGORITHME

Résultats:
***Algorithme lancé***
Tirage :
38-2-47-14-29-3-32

Nos des boules toujours dans l'urne :
1-4-5-6-7-8-9-10-11-12-13-15-16-17-18-19-20-21-22-23-24-25-26-27-28-30-31-33-34-35-36-37-39-40-41-42-43-44-45-46-48-49
***Algorithme terminé***

Le seul avantage, c'est qu'il n'y a pas (pas trop) d'instructions à retenir, qu'algobox se charge de la syntaxe, ce qui évite les erreurs de ce type et permet de se concentrer exclusivement sur l'algorithmique.
Un peu comme quand en 6e, dans la résolution des problèmes, on donne la calculette libérant les mômes des soucis d'exactitude calculatoire.
Ça permet de développer, sans bruit de fond, les capacités créatives, mais ne mettra pas le pied à l'étrier pour l'apprentissage d'un langage et de ses particularités...

@+

Hors ligne

#11 16-03-2012 15:06:12

Fred
Administrateur
Inscription : 26-09-2005
Messages : 7 352

Re : jeu

Salut,

  Effectivement, je ne crois pas qu'il faut voir Algobox comme un logiciel à utiliser très longtemps.
Mais il est intéressant pour développer les bonnes pratiques, pour visualiser très facilement
les boucles et leurs imbrications, etc....
Mais il ne vaut pas un bon langage de programmation!

Fred.

Hors ligne

#12 16-03-2012 15:38:26

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 17 401

Re : jeu

Salut,

pour visualiser très facilement les boucles et leurs imbrications, etc....

Bin, même si, utilisateur de Python et déjà pratiquant avant l'indentation, je préfère très largement Python pour visualiser les boucles, leurs imbrications...
En Python, l'indentation est obligatoire, c'est le seul fin_pour, fin_si, fin_tant que... dont on dispose : c'est très contraignant au début ou en cas de rajouts, mais visuellement, c'est pratique... Là, il n'y a qu'une pseudo indentation, dommage !

Je peux te dire que je préfère programmer à la main, sur papier, en vrai pseudo-code qu'avec AlgoBox qui se révèle extraordinairement verbeux, la preuve.
Ce n'est pas fait pour développer des programmes excédant 20 à 30 lignes, juste pour initiation à l'algorithmique : il est vrai que vu le paysage 2nde/première et les horaires, il ne faut pas penser à demander des "trucs" très (et trop élaborés)...

Je vais continuer ma découverte et voir ce que je peux en faire, malgré l'impossibilité de création de fonctions, ce qui est éminemment regrettable...

@+

Hors ligne

#13 16-03-2012 17:03:09

Fred
Administrateur
Inscription : 26-09-2005
Messages : 7 352

Re : jeu

Re-

Je suis complètement d'accord avec toi.
Mais les livres ont déjà choisi entre Algobox et Python!

Fred.

Hors ligne

#14 17-03-2012 00:11:31

Cédric
Invité

Re : jeu

Merci beaucoup pour toutes vos réponses. Cependant je ne comprends pas :="<=" & CTXT(B2;0) .
Cordialement,
C.

#15 17-03-2012 10:55:47

totomm
Membre
Inscription : 25-08-2011
Messages : 1 093

Re : jeu

Bonjour,

Le critère dans NB.SI est une chaine de caractères figés. C'est à dire que les caractères y sont interprétés littéralement sans reconnaitre une référence à une case du tableau en colonne B de la même ligne
Si on veut que le critère dépende de la valeur calculée en colonne B, il convient donc de formater la "valeur" du critère, en tant que chaine de caractère, en dehors de la fonction NB.SI

Ce que l'on peut faire sur un tableur est tout autant compréhensible et didactique que la même chose sous ALGOBOX qui est trop verbeux sous prétexte de clarté. Des instructions concises dans un langage concis permettent bien mieux de suivre et comprendre un algorithme...L'important étant de bien suivre un déroulement d'instructions

Cordialement

Hors ligne

#16 18-03-2012 21:10:08

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 17 401

Re : jeu

Re,

Retour d'expérience avec AlgoBox : http://www.bibmath.net/forums/viewtopic.php?id=5289

@+

Hors ligne

#17 19-03-2012 18:58:53

Cédric
Invité

Re : jeu

Bonsoir,
je ne comprends toujours pas : :="<=" & CTXT(B2;0) .
N'y a-t-il pas une erreur avec le symbole & que je n'arrive d'ailleurs pas à reproduire dans l'utilisation des formules avec un tableur ?
Encore merci.
Cédric

#18 20-03-2012 10:15:38

totomm
Membre
Inscription : 25-08-2011
Messages : 1 093

Re : jeu

Bonjour,

@ Cédric :
Le symbole & se trouve en minuscule sous la touche 1. il effectue la concaténation des chaines de caractères
Pourquoi mettre ="<=" & CTXT(B2;0) dans le tableur en ligne 2 (et Bn en ligne n) ?
Si on vient de tirer 15 en B2 on obtient la chaine de caractères <=15 en C2 pour traiter la non remise des numéros triés.

En effet : Si l'on tire des numéros sur une liste dans laquelle les numéros 1 à 49 figurent en position 1 à 49 et que l'on a tiré par exemple les positions 9 (parmi 49) puis 21 (parmi 48), alors les numéros 10 à 49 se sont trouvés en positions 9 à 48 puis les numéros 22 à 49 se trouvent en positions 20 à 47, puisque l'on retire les numéros tirés de la liste. On a tiré en fait les numéros 9 et 22.

Puisque le tirage équiprobable se fait sur le nombre de positions restantes, le numéro tiré correspond bien à la position majorée des décalages effectués jusqu'à la position tirée.
si maintenant l'on tire la position 15 (parmi 47), le numéro est bien 15+1=16 ou si l'on tire à nouveau la position 21, le numéro est bien 21+2=23

@ tous : Est-on certain qu'un algorithme séquentiel correct sera correctement exécuté sur le tableur ?
Réponse : NON en général, car dans un tableur l'ordre dans lequel les formules dans les cellules sont exécutées résulte de la "dépendance" des cellules entre elles. Ici  le séquentiel sera OK entre lignes de la même colonne

Cordialement

Hors ligne

#19 26-03-2012 07:06:48

Cédric
Invité

Re : jeu

MERCI BEAUCOUP A VOUS TOUS et notamment à totomm pour sa dernière réponse éclairante.
Je vais donc pouvoir tester tout cela en essayant de comprendre ce qui se passe !
Cordialement,
Cédric

Pied de page des forums