唯一的随机数组javascript

unique random array javascript

本文关键字:javascript 数组 随机 唯一      更新时间:2023-09-26

我试图创建一个数组的6个唯一的随机数出的数组,用户给了他的最大值和最小值(不低于0,不高于37)。什么是错误的?

    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("</br>The difference cannot be lower then 6");
        }
        if (minVal<1)
        {
            alert("</br>The min value cannot be lower then 1");
        }
        if (maxVal>37)
        {
            throw alert("</br>The higher value cannot be higher then 37") ;
        }
        if(minVal>0 && ((maxVal-minVal)>=6)&& (maxVal<=37) )
        {
            document.writeln("</br>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;
                }
            }
        }
    }

你知道怎么让它工作吗?

这是一个核心函数,用于在最小值和最大值之间创建N个随机数。

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;
}

此函数与DOM或问题的任何特定限制无关。然后,你可以用另一个从DOM中检索信息的函数来包装它,检查是否所有内容都在范围内,然后调用这个核心函数。

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);
}

这使得一个可重用的函数用于生成N个随机值,并使该实用程序函数与访问特定页面中的DOM的代码完全分离。由于这种方法使用集合来跟踪所使用的随机数,因此它可以扩展到非常大的数字范围或非常大的随机数,而其他一些预先构建所有可能输出列表的算法则没有这样的可扩展性。

工作演示:http://jsfiddle.net/jfriend00/48kCg/

这是一个JS函数,更简单,它做你想做的:

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;
}

这一切看起来相当复杂。您可以使用以下命令创建一个数组,其中包含0到[max]之间的[n]随机数:

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 a-b;});
}
// usage
var myarr = createArrayWithUniqueRandomNumbers(6, 37);