Aquí está el código que desarrollé para facilitar la extracción de números en un sorteo. No es un algoritmo optimizado, de hecho es bastante ineficiente ya que extrae un número y lo almacena en una lista para en la siguiente extracción poder comprobar que aún no ha salido.
El objetivo principal es que fuera sencillo y que pudiera funcionar independientemente (solo con un navegador y sin conexión a Internet).
Posteriormente incluí la página como una app para Facebook (y así aprendí algo de su plataforma para desarrolladores :))
<!DOCTYPE html> <html lang="es"> <head> <meta charset="utf-8" /> <title>Sortea</title> <meta name="viewport" content="width=device-width, initial-scale=1" /> <style> input[type='number'] {text-align: right;} textarea {vertical-align: top;} .draw {font-weight: bold; font-style: italic;} .result {font-size: 300%;} </style> </head> <body> <h1>Sortea (tantas veces como desees haciendo click sobre el botón correspondiente)</h1> <p><button type="button" onclick="draw_number()" id="button_number">Obtener</button> un número al azar entre <input type="number" min="0" max="999999999" placeholder="inicio" name="field_start" id="field_start" /> y <input type="number" min="0" max="999999999" placeholder="fin" name="field_end" id="field_end" /></p> <p><button type="button" onclick="draw_element()" id="button_element">Extraer</button> un elemento de la lista <textarea rows="10" cols="40" placeholder="con los elementos separados por comas" name="field_list" id="field_list"></textarea></p> <p id="block_result" style="display: none"></p> <script> draw = 0; numbers = []; elements =[]; function draw_number() { field_start = document.getElementById('field_start'); field_end = document.getElementById('field_end'); start = Math.abs(parseInt(field_start.value)); end = Math.abs(parseInt(field_end.value)); if(isNaN(start)) { alert('Falta el número de inicio'); field_start.focus(); return; } if(isNaN(end)) { alert('Falta el número de fin'); field_end.focus(); return; } if(start > end) { alert('El número de fin es menor que el número de inicio'); field_end.focus(); return; } interval = end - start + 1; if(numbers.length < interval) { do { result = Math.floor(Math.random() * interval + start); } while(numbers.indexOf(result) != -1); } else { alert('Se han realizado ya todos los sorteos posibles'); return; } numbers.push(result); draw += 1; display_draw(result); } function draw_element() { field_list = document.getElementById('field_list'); if(!field_list.value) { alert('No hay elementos en esa lista'); field_list.focus(); return; } list = field_list.value.split(','); if(list.length > elements.length) { do { element_index = Math.floor(Math.random() * list.length) result = list[element_index]; } while(elements.indexOf(result) != -1); } else { alert('Se han realizado ya todos los sorteos posibles'); return; } elements.push(result); draw += 1; display_draw(result); } function display_draw(result) { block_result = document.getElementById('block_result'); block_result.style.display = 'block'; if(draw > 1) block_result.innerHTML += ', '; block_result.innerHTML += '<span class="draw">(sorteo ' + draw + ')</span> <span class="result">' + result + '</span>'; } </script> </body> </html>
Y aquí está la demo.