使用UNIQUE随机数javascript填充数组

时间:2014-11-03 16:33:35

标签: javascript arrays random

我有一个数组:

var array = new Array();

这是随机函数,它给出minmax之间的随机数(见上一个Stackoverflow主题):

function randomIntFromInterval(min,max) {
    return Math.floor(Math.random()*(max-min+1)+min);
}

这个数组意味着有9个单元格。我想用随机数填充它,重要的条件是每个数字都是唯一的,这意味着这个数组中的数字不能找到两次或更多。所以最后,这里是我被卡住的地方(整个代码):

var array = new Array();

function randomIntFromInterval(min,max) {
    return Math.floor(Math.random()*(max-min+1)+min);
}

// populate the variable "array" with 9 different
// random numbers
function randomlyInitializeArray() {
    var random = 0;

    // For each cell (9 cells) in my "array"
    for (var i = 0; i < maxLength; i++) {

        // Return a number between 1 & 9
        random = randomIntFromInterval(1, maxLength);

        /*  Verifying if this random number is already in 
            the "array" /!\ stuck here /!\ */
    }
}

那么,使用9个唯一(不同)数字填充数组的逻辑是什么?

4 个答案:

答案 0 :(得分:1)

所以你想要1-9的9个随机唯一数字?在我看来,这与在随机顺序中想要数字1到9一样。

这可以通过以下方式完成:

[1,2,3,4,5,6,7,8,9].sort(function () { // shuffle
    return Math.random() - 0.5; // returns > 0 ~50% of the time
});

否则你可以这样做:

var array = [];
while (array.length < 9) {
    array = array_unique(array.concat([ get_random_number() ]);
}
console.log(array);

大多数框架都以这种或那种方式具有array_unique功能,或者只编写自己的功能。

有更快的方法可以做到这一点,但明确包含对unique()的调用使这个实现易于理解和验证。

答案 1 :(得分:1)

如果您想从特定间隔(使用该功能)获得9个随机数:

您可以使用do-while循环来获取随机数,直到您拥有一个唯一的数字。

您可以通过contains()函数检查数字是否已存在于数组中。

for (var i = 0; i < maxLength; i++) {
    do {
        random = randomIntFromInterval(1, maxLength);
    while( array.contains(random) );          // will return false if random isn't asigned

    array.push(random);
}

如果您不关心间隔,并且您只需要9个唯一值(按随机顺序为1-9),则可以使用1-9创建数组并将其随机播放:

var myArray = ['1','2','3','4','5','6','7','8','9'];
newArray = shuffle(myArray);

function shuffle(o){ 
    for(var j, x, i = o.length; i; j = Math.floor(Math.random() * i), x = o[--i], o[i] = o[j], o[j] = x);
    return o;
};

来自how can I shuffle an array

的随机播放方法

答案 2 :(得分:1)

为什么不从1到最大值获得一个数组然后将其洗牌

&#13;
&#13;
//+ Jonas Raoni Soares Silva
//@ http://jsfromhell.com/array/shuffle [v1.0]

function shuffle(o) { //v1.0
  for (var j, x, i = o.length; i; j = Math.floor(Math.random() * i), x = o[--i], o[i] = o[j], o[j] = x);
  return o;
};

function randomIntFromInterval(min, max) {
  return Math.floor(Math.random() * (max - min + 1) + min);
}

// populate the variable "array" with 9 different
// random numbers
function randomlyInitializeArray(min, max) {
  var start = min;
  var randomMax = randomIntFromInterval(min, max)
  var myArray = [];
  for (var i = 0; start <= randomMax; myArray[i++] = start++);

  myArray = shuffle(myArray);
  console.log("Min: "+min);
  console.log("Max: "+max);
  console.log("random Max: "+randomMax)
  
  console.log(myArray)

}

randomlyInitializeArray(2,40);
&#13;
&#13;
&#13;

答案 3 :(得分:0)

我建议使用while循环,例如

function unique_nums(n) {
    var myarray = [];
    for (var i=0;i<n;i++){
        var next_num = Math.random();
        while (myarray.indexOf(next_num) !== -1) {
            next_num = Math.random();
        }
        myarray.push(next_num);
    }
    return myarray;
}

这将确保数组在push之前不存在随机数。