在一个区间之间生成两个random数组

时间:2014-12-16 13:44:35

标签: javascript arrays

我想使用一个生成两个长度相同的数组的函数,但第一个和第二个数组的值不应该是重复的,第一个数组中的值都不应该在第二个数组中。

到目前为止我尝试了什么:

function generateSiruri(width){
    var exists = false;
        for(var i = 0; i < width; i++){
            var randomNumber = Math.floor(Math.random()*101);
            var secondRandomNumber = Math.floor(Math.random()*101);

            if(sir1[i] == randomNumber && sir2[i] == secondRandomNumber && randomNumber == secondRandomNumber && sir1[i] == secondRandomNumber){
                exists = true;
                return;
            }

            if(!exists){
                sir1.push(randomNumber);
                sir2.push(secondRandomNumber);
            }
        }        
    sortAscending(sir1);
    sortAscending(sir2);
}

function sortAscending(array){
    var sort;
        for(i = 0; i < array.length; i++){
            for(var j = 0; j < array.length; j++){
                if(array[j] > array[j + 1]){
                    sort = array[j];
                    array[j] = array[j + 1];
                    array[j + 1] = sort;
                }
            }
        }
    return;
}

另外,如果您有更好的选择,可以使用sortAscending函数对这些数组进行排序,并在generateSiruri中提供if条件的更好选项。我现在看不到更好的选择。 THX!

2 个答案:

答案 0 :(得分:2)

鉴于你的评论,这闻起来像,所以我会更多地打破这个。

从一个数组开始,使其长度为width的两倍(迭代width*2次):

  

var ary = [];
 for (var i = width * 2; i > 0; i--){ /*...*/ }

然后你想要一个数字中尚未出现的数字(我们可以使用Array.prototype.indexOf()进行检查):

  

var r = Math.floor(Math.random() * 101);
 while (ary.indexOf(r) != -1) r = Math.floor(Math.random() * 101);

然后简单地将您的唯一值添加到数组

  

ary.push(r);

对它进行排序(您的冒泡排序适用于所有意图和目的),然后您可能希望通过您的函数将其返回。这里我们返回一个数组数组;使用Array.prototype.slice我们可以将单个数组转换为两个数组:

  

return [ ary.slice(0, width), ary.slice(width) ];


鉴于它不是家庭作业......

function generateSiruri(width){
  var ary = [];
  for (var i = width * 2; i > 0; i--){
    var r = Math.floor(Math.random() * 101);
    while (ary.indexOf(r) != -1) r = Math.floor(Math.random() * 101);
    ary.push(r);
  }
  ary.sort(); // (or your custom sort method)
  return [ ary.slice(0, width), ary.slice(width) ];
}

答案 1 :(得分:2)

这样做:

    while(sir1.length < width) {
        var randomNumber = Math.floor(Math.random()*101);
        if (sir1.indexOf(randomNumber) == -1)
            sir1.push(randomNumber);
    }

    while(sir2.length < width)  {
        var randomNumber = Math.floor(Math.random()*101);
        if ((sir2.indexOf(randomNumber) == -1) && (sir1.indexOf(randomNumber) == -1))
            sir2.push(randomNumber);
    }

这样,您首先使用唯一值填充sir1,然后使用也不在sir1中的唯一值分别填充sir2。