Che problemi può avere l’uso individuale dei numeri? C’è già l’ordinamento alfabetico iniziale ed il primo numero che stabilisce da dove si inizia a contare, per rendere difficili e casuali gli eventuali sfruttamenti di lievi piccole possibilità in più di essere estratto.
Siccome anche la semplicità e la chiarezza sono un valore, credo che questo sia molto maggiore a fronte di non chiare motivazioni contrarie.
Giusto questo mi viene in mente. Sulla stessa ruota se viene estratto un numero, gli altri numeri non saranno da 1 a 90, ma da 1 a 90 meno i numeri usciti. Questo, in realtà, non dovrebbe comportare alcun problema, dato che resta pur sempre casuale quel che accadrà e non sfruttabile. Però, si può migliorare. Anziché usare i numeri di una ruota e poi passare alla successiva, si usano i primi numeri di tutte le ruote e poi (eventualmente) i secondi numeri di tutte le ruote e così via. In questo modo, abbiamo (quasi sempre) veri numeri da 1 a 90, a meno che, i candidati da estrarre sono più di 11 (ruote locali + quella nazionale) e quindi si finisce sui secondi numeri delle ruote, cioè non più esattamente da 1 a 90.
Non vedo chiaramente alcun problema nemmeno nella versione attuale. Ad ogni modo, ecco una versione perfezionata:
<!DOCTYPE html>
<html>
<head>
<title>Estrazione casuale</title>
<meta charset="utf-8" />
<style>
body {
margin:0 auto;
width:800px;
line-height:125%;
}
p, div, table {
margin:0 0 16px 0;
}
input {
width:30px;
text-align:center;
}
body, input, button, textarea {
font-family:Verdana,sans-serif;
font-size:16px;
}
.verticale {
-ms-transform:rotate(-90deg);
-moz-transform:rotate(-90deg);
-webkit-transform:rotate(-90deg);
transform:rotate(-90deg);
}
.prima-colonna {
vertical-align:bottom;
padding-right:8px;
font-size:14px;
color:#808080;
}
#ruote div {
margin:0;
width:40px !important;
}
#ruote th {
height:60px;
vertical-align:bottom;
padding-bottom:20px;
color:#808080;
}
</style>
<script>
function creaTabellaRuote() {
var e = document.getElementById("ruote");
var righe = '';
var nomiRuote = ['Bari','Cagliari','Firenze','Genova','Milano','Napoli','Palermo','Roma','Torino','Venezia','Nazionale'];
var cella = '<td><input type="text" class="estratto"></td>';
// Costruisce una riga con il nome di ciascuna ruota
// Riserva una posizione iniziale per le etichette 1° 2° 3° 4° 5° estratto
righe += '<tr><th> </th>';
for (var i = 0; i < nomiRuote.length; i++) {
righe += '<th><div class="verticale">' + nomiRuote[i] + '</div></th>';
}
righe += '</tr>';
// Costruisce 5 righe per i 5 numeri estratti per ciascuna ruota
for (var i = 0; i < 5; i++) {
righe += '<tr><td class="prima-colonna">'+ Number(i + 1) +'°</td>';
for (var c = 0; c < 11; c++) { righe += cella; }
righe += '<tr>';
}
e.innerHTML = righe;
}
function candidatiEstratti() {
var e_c = document.getElementById("candidati");
var e_r = document.getElementById("risultato");
var e_e = document.getElementsByClassName("estratto");
// Svuota il risultato
e_r.innerHTML = '';
// Recupera i candidati uno per riga e li mette in ordine alfabetico
var candidati = e_c.value.split('\n').sort();
// Riscrive i candidati in ordine alfabetico nell'elenco
e_c.value = candidati.join('\n');
e_r.innerHTML = '<p>I candidati sono stati messi in ordine alfabetico</p>';
// Determina da quale candidato si inizia a contare
var Ni = Number(e_e[0].value) % candidati.length;
if (Ni === 0) Ni = candidati.length;
e_r.innerHTML += '<p>Si inizia a contare dal candidato: '+e_e[0].value+' modulo '+candidati.length+' = '+Ni+': '+candidati[Ni-1]+'</p>';
// Si estraggono tanti candidati quanti ne sono stati richiesti
var Nc = document.getElementById("nCandidati").value;
var estratti = [];
for (var i = 1; i <= Nc; i++) {
// Ogni successivo numero estratto disponibile in tabella indica quale candidato risulta estratto
var nCandidato = (Number(e_e[i].value) + Ni - 1) % candidati.length;
if (nCandidato === 0) nCandidato = candidati.length;
estratti.push(candidati[nCandidato - 1]);
// Si riparte a contare dall'ultimo candidato estratto
Ni = nCandidato;
// Viene eliminato l'ultimo candidato estratto dalla lista affinché non sia estratto di nuovo
candidati.splice(nCandidato - 1, 1);
}
e_r.innerHTML += '<p>I candidati estratti sono: '+estratti.join(', ')+'.</p>';
}
</script>
</head>
<body onload="creaTabellaRuote()">
<h1>Estrazione casuale</h1>
<h3>Numeri estratti nelle ruote del Lotto</h3>
<p>Le ruote locali sono in ordine alfabetico, in fondo la ruota nazionale. Quando si decide di estrarre casualmente dei cadidati, occorre stabilire a quale giorno dell'estrazione del Lotto bisogna fare riferimento per compilare questa tabella. Assicurarsi di copiare i numeri rispettando l'effettivo ordine di estrazione (1° estratto, 2° estratto, ecc.) e non l'eventuale ordinamento crescente dei numeri. È sufficiente inserire un numero di numeri pari al numero dei candidati da estrarre più uno.</p>
<table id="ruote"></table>
<h3>Candidati da estrarre casualmente</h3>
<div>Numero candidati da estrarre: <input type="text" id="nCandidati" value="1" /></div>
<p>Scrivere di seguito, uno per riga, i nomi utente (o cognome e nome) dei candidati da estrarre. Saranno messi in ordine alfabetico automaticamente.</p>
<textarea id="candidati" rows="10" cols="30"></textarea><br />
<button type="button" onclick="candidatiEstratti()">Elenca candidati estratti</button>
<h3>Risultato</h3>
<div id="risultato"></div>
</body>
</html>