Un algorithme de tirage sans remise - IREM Aix

publicité
Un algorithme de tirage sans remise
1
Description de l'algorithme
L'algorithme proposé ici permet de réaliser le tirage sans remise de K objets parmi N
(K ≤ N ).
On dispose les N objets dans un tableau à une dimension. Ce tableau est partagé dynamiquement en deux parties :
• une première partie, indexée de 1 à p, qui contient les objets parmi lesquels va s'effectuer le tirage au hasard d'un objet (cette partie contient N objets au départ, i.e
p = N)
• une deuxième partie, indexée de p + 1 à N qui contient les objets déjà tirés (cette
partie est vide au départ)
objets déja tirés
objets non encore tirés
↑
1
↑ ↑
↑
p (p + 1)
N
On tire au hasard un objet parmi les les p objets non encore tirés, ce qui revient à tirer
au hasard un indice j entre 1 et p. Puis on sort de l'urne cet objet ; pour cela on
échange les objets d'indice j et p et on décrémente p pour faire en sorte que l'objet tiré
appartienne au paquet des objets déjà tirés.
↑
1
4
↑
s objets déja tirés
↑
↑
j
p
N
La situation après l'échange est alors la suivante :
↑
1
s
↑
4 objets déja tirés
↑
↑
j
p
N
et celle obtenue après avoir décrémenté p d'une unité :
objets déja tirés
objets non encore tirés
↑
1
1
↑
↑
p
N
Le tirage suivant se fait parmi les objets indexés de 1 à p.
algorithme
p←N
k←K
i de 1 à p
T [i] ← ieme objet
i de 1 à k
pour
pour
pour
faire
faire
tirer un nombre j au hasard dans {1,...,p}
aux ← T [j]
T [j] ← T [p]
T [p] ← aux
p ← (p − 1)
i de p + 1 à p + k
acher T [i]
faire
Remarque :
il peut paraître assez peu naturel d'indexer les objets tirés de (p + 1) à (p + k (= N )). On
aurait pu adopter le parti de les indexer de 1 à k mais alors, à chaque nouveau tirage,
celui-ci serait eectué parmi les objets non encore tirés, indexés de p + 1 à N , ce qui, à
son tour, paraît assez peu naturel...
2
Les scripts
Les programmes Scratch, Algobox et Python (version 2.6) sont téléchargeables sur le site
de l'Irem d'Aix-Marseille ainsi que le script du programme pour TI 83+. Pour simplier
la saisie des entrées, les objets à tirer sont les entiers de 1 à N mais on aurait pu choisir
tout autre type d'objet permis par les diérents langages de programmation. Les programmes Algobox et Python sont commentés dans le corps du script. Par contre il n'est
pas possible d'inclure de commentaires dans un script Scratch. Les diérentes parties de
ce dernier sont présentées ci-dessous. On pourra remarquer que la traduction française
de ce logiciel mériterait d'être revue (cf notamment les instructions concernant l'initialisation de l'urne).
2
2.1 Script Scratch
Initialisation des variables
Initialisation de l'urne
Tirage des numéros
Achage des numéros tirés
3
2.2 Programme TI 83+
:Input "N=",P
:Input "K=",K
:For(I, 1, P, 1)
:I→ L1(I)
:End
:For(I, 1, K, 1)
:randInt(1, P)→ J
:L1(J)→ A
:L1(P)→ L1(J)
:A→ L1(P)
:P-1→ P
:End
:For(I,P+1,P+K, 1)
:Disp L1(I)
:End
2.3 Programme python
# -*- coding: iso-8859-1 -*from math import *
from random import *
# programme qui simule le tirage sans remise de k objets parmi n
p=input("nombre d'objets: ")
k=input('nombre de tirages à réaliser: ')
T=range(1,p+1,1)
# initialisation de l'urne
for i in range(k):
# tirage des k numéros
d=randint(1,p)
aux=T[d-1]
T[d-1]=T[p-1]
T[p-1]=aux
p=p-1
print 'numeros tirés: ',T[p:p+k+1] # affichage des numéros tirés
4
Programme Algobox
1 VARIABLES
2
p EST_DU_TYPE NOMBRE
// nombre d'objets non tirés
3
k EST_DU_TYPE NOMBRE // nombre d'objets à tirer
4
i EST_DU_TYPE NOMBRE
5
aux EST_DU_TYPE NOMBRE
6
j EST_DU_TYPE NOMBRE
7
T EST_DU_TYPE LISTE
// "urne", liste des objets à tirer
8 DEBUT_ALGORITHME
9
AFFICHER "Nombre d'objets: "
10
LIRE p
11
AFFICHER p
12
AFFICHER "Nombre de tirages: "
13
LIRE k
14
AFFICHER k
15
//Initialisation de l'urne
16
POUR i ALLANT_DE 1 A p
17
DEBUT_POUR
18
T[i] PREND_LA_VALEUR i
19
FIN_POUR
20
//tirage des k numéros
21
POUR i ALLANT_DE 1 A k
22
DEBUT_POUR
23
j PREND_LA_VALEUR floor(random()*p)+1
24
aux PREND_LA_VALEUR T[j]
25
T[j] PREND_LA_VALEUR T[p]
26
T[p] PREND_LA_VALEUR aux
27
p PREND_LA_VALEUR p-1
28
FIN_POUR
29
//affichage des numéros tirés
30
POUR i ALLANT_DE 1 A k
31
DEBUT_POUR
32
AFFICHER T[p+i]
33
//insertion d'un séparateur entre les numéros
34
AFFICHER "; "
35
FIN_POUR
36 FIN_ALGORITHME
5
Téléchargement