en Laboratorio

Sortea

Aquí está el código que desarrollé para facilitar la extracción de números en un sorteo (en la ¡NUEVA! versión de Sortea han cambiado algunas cosas pero lo básico sigue igual). 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 ¡NUEVA! demo.