Ho subito pensato ad un upgrade, in particolare per permettere al suo creatore di partecipare e per renderlo in qualche modo piu' trasparente perche', quando c'e' di mezzo la fortuna e ambitissimi premi in una comunity di lamers, la puzza di broglio la si sente ancora prima di avviare il browser. La psicosomatizziamo. E poi si impara qualcosa.
Possiamo "estrarre" numeri casuali in maniera imprevedibile ma ripetibile? Sembra una contraddizione in termini, ma grazie ad un "difetto" dei nostri PC la cosa e' possibile.
I computer, infatti, hanno problemi a creare numeri casuali (non che noi uomini siamo molto meglio, ma magari ne parleremo un'altra volta). Sono persino piu' zelanti e pignoli del sottoscritto. Sono bravissimi a seguire istruzioni dettagliate, ma non sanno proprio come stupirci.
Come fai a dare istruzioni precise per creare numeri imprevedibili? Ci sono tantissime istruzioni per creare serie di numeri "a caso" ma producono tutte lo stesso risultato!!!! Il "trucco" e' di introdurre un elemento di "sorpresa", un seme, che poi dia il via all'algoritmo tanto preciso e ripetibile. Dato lo stesso seme, produrremo la stessa serie. Cambiando il seme, la serie sara' completamente diversa e indipendente.
Questo pero' sposta semplicemente il problema. Come creiamo questo elemento di sopresa? Possiamo fornirlo noi, o chiedere al computer di crearlo partendo da variabili che dovrebbero cambiare spesso (la data, l'ora, la posizione del mouse, in nome del PC...) in modo da avere un punto di partenza sempre diverso e produrre serie sempre diverse. quindi il nostro algoritmo e' "buono" quanto buono e' il nostro seme.
Quanto e' "buono" il nostro seme? Beh, chiediamoci due cose:
- Quanti semi diversi possiamo creare?
Se usiamo la somma di ore, minuti e secondi, per esempio, possiamo avere solo valori tra 0 e 141. Significa 141 possibili estrazioni. Un po' pochine.
- Come sono "distribuiti" questi semi? Nell'esempio di prima 141 lo otteniamo solo alle 23:59:59, mentre 72 si ottinere alle 12:30:30, ma anche alle 12:29:31 o alle 10:40:22... quindi la combinazione che ha seme 72 e' parecchio piu' probabile della combianzione che ha seme 141.
Quindi e' molto importante creare un seme che possa avere un numero altissimo di valori tutti equalmente probabili.
Nel caso de "Il gioco del SuperEnalotto.O", inoltre, volevo rendere la vita difficile a chi tentasse di barare. Vediamo come
Code: Select all
numeri <- c(1:30)
estrazioni <- 4
maxValSeme <- 2120000000
Code: Select all
ore_Penultimo_post <- 18
minuti_Penultimo_post <- 2
numero_Ultimo_Post <- 149656
numero_casuale <- 1131965
Code: Select all
seme <- (ore_Penultimo_post + numero_Ultimo_Post) * (minuti_Penultimo_post + numero_Ultimo_Post) + numero_casuale
Purtroppo pero' e' difficile sapere la distribuzione di questi numeri. Il numero casuale e', appunto, casuale e quindi ci garantisce una distribuzione uniforme dei valori. Ore, minuti e numero dell'ultimo post non sono per nulla uniformi, ma hanno l'effetto di creare parecchie distribuzioni uniformi e aumentando il numero di valori che il nostro seme puo' assumenre. Infine un ultimo problema. Il nostro programma che crea numeri casuali non puo' accettare numeri grandi a piacere. Per fortuna il limite e' pittosto alto: "maxValSeme" = 2.120.000.000 (il vero numero e' un po' piu' alto, ma non so quale sia)
Code: Select all
semino <- seme - ( floor(seme/maxValSeme) * maxValSeme )
Code: Select all
set.seed(semino)
vincenti <- sort(sample(numeri, size = estrazioni, replace = FALSE, prob = NULL) )
Se mettete questo codice in R, otterrete che i numeri vincenti sono
8 9 13 22
In questo modo chi scommette dei numeri non sa quali siano le 4 variabili che daranno origine al seme. Chi posta il numero casuale potrebbe barare e postarne uno che ha deciso prima, ma gli altri 3 numeri sono a lui sconosciuti quando posta la sua combo. Chiunque puo' verificare chi ha vinto.
GG