【问题标题】:populate array with UNIQUE random numbers javascript用唯一的随机数javascript填充数组
【发布时间】:2014-11-03 16:33:35
【问题描述】:

我有一个数组:

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 个唯一(不同)数字填充数组的逻辑是什么?

【问题讨论】:

  • 用 1,2,3...9 填充它,然后填充 shuffle

标签: javascript arrays random


【解决方案1】:

为什么不获取一个从 1 到 -max 的数组然后随机播放它

//+ 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);

【讨论】:

  • 感谢您的宝贵时间,我了解您的解决方案!
  • 刚刚意识到我误读了您的问题并使它具有从最小到最大的随机数而不是 1-9,但我会这样留下它,因为它可以很容易地从1-9 通过将 1 和 9 传递给 randomlyInitializeArray
  • 是的,我只需要更改您的值,算法对我来说很清楚,再次感谢您:)
【解决方案2】:

如果你想从一个特定的区间得到 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;
};

shuffle 方法取自how can I shuffle an array

【讨论】:

  • 谢谢,这个例子非常适合我的应用,所以点赞!
  • @Zeratops 您可以随时为您认为有帮助的答案投票,而不仅仅是在 cmets 中表示感谢
【解决方案3】:

所以你想要从 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() 的调用使此实现易于理解和验证。

【讨论】:

    【解决方案4】:

    我推荐一个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;
    }
    

    这将确保随机数在pushed 之前不存在于数组中。

    【讨论】:

    • 感谢您对 Stick 的回答,但我更喜欢 shuffle() 方法,因为它更适合我的需求。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-23
    • 1970-01-01
    • 2017-06-04
    • 2013-09-16
    • 1970-01-01
    相关资源
    最近更新 更多