J’avais parlé cet été de l’utilisation des chiffres du us treasury balance comme générateur (involontaire) de nombres aléatoires. Cet été, un débat intéressant a secoué le Québec, suite à la plainte déposée par deux joueurs (compulsifs) de l’Extra. L’histoire est raconté en détails sur le site de canoe.ca, ou de lapresse.ca. Le jeu est assez simple. L’histoire un peu moins (c’est pour cela que j’ai préféré renvoyer vers deux sources racontant la même histoire). Pour essayer d’expliquer simplement ce qui s’est passé revenons un peu sur le jeu. Tous les jours, Loto-Québec tire au hasard un nombre de 7 chiffres.
Quand on achète un ticket, un numéro nous est attribué… et on espère qu’il sera tiré le soir. Mais le soucis est que les joueurs qui intentent un procès n’achetaient pas un mais dix tickets. Et étrangement, à chaque fois, ils avaient un ticket gagnant, et un seul.
En fait, quand on achetait dix combinaisons d’extra, il semble que le premier chiffre sans remise parmi 0 à 9, les cinq suivants avec remise parmi 0 à 9 et le dernier sans remise parmi 0 à 9 (pour reprendre la formulation qu’a utilisé Christian Léger de l’UdM pour me l’expliquer). Sur un achat, on ne voit rien, on a des nombres uniforme… mais avec répétition, ça se complique.
En fait, c’est toujours quand on étudie la dynamique des générateurs de nombres aléatoires que l’on a des surprises.
Par exemple sur les tirages de l’extra (et non pas les numéros des combinaisons des billets, car on ne les trouve pas sur internet, il faudrait acheter les billets pour refaire l’expérience). On peut récupérer l’historique des tirages en ligne, sur le site de loto-quebec.com.
> extra=read.table("http://freakonometrics.blog. free.fr/public/data/extra-loto-quebec.csv",sep=";",header=TRUE) > n=1940 > extra=extra[1:(n-1),1:2] > X=extra[,2]/10000000
Mais générer du hasard, ça n’est pas que ça… Et sur cette série, si on fait des tests sur l’indépendance des observations, on est un peu surpris,
> library(lawstat) > runs.test(X, plot.it = FALSE, alternative = "two.sided") Runs Test - Two sided data: X Standardized Runs Statistic = -1.8, p-value = 0.07273 > runs.test(X, plot.it = FALSE, alternative = "positive.correlated") Runs Test - Positive Correlated data: X Standardized Runs Statistic = -1.8, p-value = 0.03637 > library(FitAR) > LjungBoxTest(qnorm(X), k=0, lag.max=12, + StartLag=1, SquaredQ=FALSE) m Qm pvalue 1 7.2 0.0075 2 9.2 0.0102 3 10.9 0.0125 4 10.9 0.0276 5 15.3 0.0090 6 15.4 0.0171 7 16.1 0.0244 8 16.3 0.0380 9 16.7 0.0538 10 20.6 0.0240 11 20.8 0.0357 12 20.8 0.0533