javascript de matriz aleatoria única

Estoy tratando de crear una matriz de 6 números aleatorios únicos de una matriz a la que el usuario dio su valor máximo y valor mínimo (no inferior a 0 y no superior a 37). ¿Qué es incorrecto?

function randCalc(maxVal,minVal) { var maxVal = document.getElementById("maxRange").value; var minVal = document.getElementById("minRange").value; var tmpArray = new Array(6) ; tmpArray = [0]; var realArray = new Array(6); realArray = tmpArray; if ((maxVal - minVal) < 6) { alert("
The difference cannot be lower then 6"); } if (minVal<1) { alert("
The min value cannot be lower then 1"); } if (maxVal>37) { throw alert("
The higher value cannot be higher then 37") ; } if(minVal>0 && ((maxVal-minVal)>=6)&& (maxVal<=37) ) { document.writeln("
The random numbers are: "); for(i=0;i<=(6);i++) { var randLotto = Math.floor(Math.random() * (maxVal - minVal + 2) + minVal); tmpArray[i] = randLotto; } for(var j=0;j<=maxVal;j++) { for(var k=0;k<6;k++) { if(tmpArray[j]==realArray[k]) { j++; } else if(tmpArray[j]!=realArray[k]) { realArray[k]=tmpArray[j]; } } if(realArray[6]!=null) { break; } } } }

¿Alguna idea de cómo hacer que funcione?

Aquí hay una función central para crear N números aleatorios entre un valor mínimo y máximo.

 function randCalc(maxVal, minVal, numRandoms) { var max = Math.max(maxVal, minVal); var min = Math.min(maxVal, minVal); // create a set to keep track of numbers we've already used so // we don't repeat any random numbers var set = {}; var randoms = []; var rand; // prevent infinite loop if not given enough range if (max - min < numRandoms) { return randoms; } while (randoms.length < numRandoms) { rand = Math.floor((Math.random() * (max - min + 1) + min)); // if we haven't already used this random number // then put it in our output array and add it to the set if (!(rand in set)) { randoms.push(rand); set[rand] = true; } } return randoms; } 

Esta función no tiene nada que ver con el DOM ni con ningún límite particular de su problema. Luego puede envolver esto con otra función que recupera información del DOM, verifica si todo está dentro del rango y luego llama a esta función central.

 function makeRandoms() { // retrieve DOM values and convert them to numbers var maxVal = document.getElementById("maxRange").value; var minVal = document.getElementById("minRange").value; if (!maxVal || !minVal) { alert("You must specify both a minimum and maximum value"); return; } // convert both to numbers maxVal = parseInt(maxVal, 10); minVal = parseInt(minVal, 10); if (minVal < 1) { alert("The min value cannot be lower then 1"); return; } if (maxVal > 37) { alert("The higher value cannot be higher then 37"); return; } if (maxVal - minVal < 6) { alert("The difference cannot be lower then 6"); return; } var randoms = randCalc(maxVal, minVal, 6); // output the randoms array here document.getElementById("output").innerHTML = JSON.stringify(randoms); } 

Esto hace una función reutilizable para generar N valores aleatorios y mantiene esa función de utilidad completamente separada de su código que accede al DOM en una página en particular. Debido a la forma en que esto usa un conjunto para realizar un seguimiento de los números aleatorios utilizados, esto es escalable a rangos numéricos muy grandes o números muy grandes de números aleatorios cuando algunos otros algoritmos que crean una lista de todos los resultados posibles no son tan escalables.

Demostración de trabajo: http://jsfiddle.net/jfriend00/48kCg/

Aquí hay una función JS, más simple, que hace lo que pretendes:

 function randCalc(maxVal,minVal){ var text = ""; var possible = []; for(var i = minVal; i < maxVal; i++){ possible.push(i); } for( var i=0; i < 6; i++ ){ if(text.length == 6){ return text; } text += possible[Math.floor(Math.random() * possible.length)]; if(text > 6){ text = text.substring(0, 6); } } return text; } 

Todo parece bastante complicado. Puede crear una matriz con [ n ] números aleatorios entre 0 y [ max ] usando:

 function createArrayWithUniqueRandomNumbers(n, max) { var checkobj = {} ,arr = []; while (arr.length < n) { var x = Math.floor(Math.random()*(max+1)); if (!(x in checkobj)) { checkobj[x] = 1; arr.push(x); } } //sorting for convenience return arr.sort(function(a,b){return ab;}); } // usage var myarr = createArrayWithUniqueRandomNumbers(6, 37);