Javascript 中没有重复的随机数生成器?

问题描述 投票:0回答:8

我需要帮助编写一些代码,该代码将从 12 个数字的数组中创建一个随机数,并打印 9 次而不会出现重复。这对我来说很难完成。有什么想法吗?

javascript random
8个回答
9
投票

var nums = [1,2,3,4,5,6,7,8,9,10,11,12];
var gen_nums = [];

function in_array(array, el) {
   for(var i = 0 ; i < array.length; i++) 
       if(array[i] == el) return true;
   return false;
}

function get_rand(array) {
    var rand = array[Math.floor(Math.random()*array.length)];
    if(!in_array(gen_nums, rand)) {
       gen_nums.push(rand); 
       return rand;
    }
    return get_rand(array);
}

for(var i = 0; i < 9; i++) {
    console.log(get_rand(nums));
}


4
投票

最有效和高效的方法是打乱数字,然后打印前九个数字。使用好的随机播放算法。Thilo 建议的结果会很差。 看这里。

编辑 这是一个简短的 Knuth Shuffle 算法示例:


void shuffle(vector<int> nums)
{
  for (int i = nums.size()-1; i >= 0; i--)
  {
    // this line is really shorthand, but gets the point across, I hope.
    swap(nums[i],nums[rand()%i]);
  }
}

0
投票

尝试一次:

//Here o is the array;
var testArr = [6, 7, 12, 15, 17, 20, 21];
    shuffle = function(o){ //v1.0
                        for(var j, x, i = o.length; i; j = parseInt(Math.random() * i), x = o[--i], o[i] = o[j], o[j] = x);
                        return o;
                };
shuffle(testArr);

0
投票

这相对简单,其背后的理论是创建另一个数组来跟踪您使用过的数组元素。

var tempArray = new Array(12),i,r;
for (i=0;i<9;i++)
    {
    r = Math.floor(Math.random()*12);    // Get a random index
    if (tempArray[r] === undefined)      // If the index hasn't been used yet
        {
        document.write(numberArray[r]);  // Display it
        tempArray[r] = true;             // Flag it as have been used
        }
    else                                 // Otherwise
        {
        i--;                             // Try again
        }
    }

其他方法包括打乱数组、从数组中删除使用过的元素或将使用过的元素移动到数组末尾。


0
投票

如果我理解正确的话,你想洗牌你的数组。

循环几次(应该是数组的长度),在每次迭代中,获取两个随机数组索引并交换其中的两个元素。 (更新:如果你真的认真对待这个问题,这可能不是最好的算法)。

然后您可以打印前九个数组元素,这些元素将按随机顺序排列并且不会重复。


0
投票

这是获取最小值和最大值之间不重复的随机数的通用方法:

function inArray(arr, el) {
    for(var i = 0 ; i < arr.length; i++) 
            if(arr[i] == el) return true;
    return false;
}

function getRandomIntNoDuplicates(min, max, DuplicateArr) {
    var RandomInt = Math.floor(Math.random() * (max - min + 1)) + min;
    if (DuplicateArr.length > (max-min) ) return false;  // break endless recursion
    if(!inArray(DuplicateArr, RandomInt)) {
       DuplicateArr.push(RandomInt); 
       return RandomInt;
    }
    return getRandomIntNoDuplicates(min, max, DuplicateArr); //recurse
}

致电:

var duplicates  =[];
for (var i = 1; i <= 6 ; i++) { 
    console.log(getRandomIntNoDuplicates(1,10,duplicates));
}

0
投票
const nums = [1,2,3,4,5,6,7,8,9,10,11,12];
for(var i = 1 ; i < 10; i++){
    result = nums[Math.floor(Math.random()*nums.length)];
    const index = nums.indexOf(result);
    nums.splice(index, 1);
    console.log(i+' - '+result);
}

0
投票

var nums = [1,2,3,4,5,6,7,8,9];
var gen_nums = [];

function in_array(array, el) {
   for(var i = 0 ; i < array.length; i++) 
       if(array[i] == el) return true;
   return false;
}

function get_rand(array) {
    var rand = array[Math.floor(Math.random()*array.length)];
    if(!in_array(gen_nums, rand)) {
       gen_nums.push(rand); 
       return rand;
    }
    return get_rand(array);
}

for(var i = 1; i < 9; i++) {
    console.log(get_rand(nums));
}

© www.soinside.com 2019 - 2024. All rights reserved.