使用Math.random时如何避免获得两个相同的数组?

时间:2017-01-19 00:59:02

标签: javascript arrays random

我正在玩一个网络应用程序并遇到一个问题,生成两个不同的项目,避免两次获得相同的项目。

// ITEM 1
var item1 = [
  "i/itemname1.png",
  "i/itemname2.png",
  "i/itemname3.png"
];

var size = item1.length
var x = Math.floor(size*Math.random())

function getItem1() {
    document.getElementById("item1").src = item1[x];
}
getItem1();

// ITEM 2
var item2 = [
  "i/itemname1.png",
  "i/itemname2.png",
  "i/itemname3.png"
];

var size = item2.length
var x = Math.floor(size*Math.random())

function getItem2() {
    document.getElementById("item2").src = item2[x];
}
getItem2();

使用此代码,我有机会获得两个相同的项目。 我需要一个解决方案来避免这种情况有什么想法吗?

5 个答案:

答案 0 :(得分:1)

跳过您已经生成的索引。

// ITEM 1
var item1 = [
  "i/itemname1.png",
  "i/itemname2.png",
  "i/itemname3.png"
];

var size = item1.length
var x = Math.floor(size*Math.random())

function getItem1() {
    document.getElementById("item1").src = item1[x];
}
getItem1();

// ITEM 2
var item2 = [
  "i/itemname1.png",
  "i/itemname2.png",
  "i/itemname3.png"
];

// changes start here:
size = item2.length
var x2 = Math.floor((size-1)*Math.random())
if (x2 >= x) x2++ // skip `x`

function getItem2() {
    document.getElementById("item2").src = item2[x2]; // <-- x2 here, not x
}
getItem2();

答案 1 :(得分:1)

您可以使用以下方法:

n = array.length

1. Get an item (randomly) from the array (from 0 to n) -> index1.
2. Swap the items in index1 with n
3. n = n - 1
4. Get an item (randomly) from the array (from 0 to n) -> index2.

这两个项目会有所不同

答案 2 :(得分:1)

如果您对数组进行切片(以在函数范围内创建重复数组),则生成一个随机数并拼接数组,直到您有两个unquie项为止。

function getRandom(listOfThings,numberOfItems){
    let newarray = listOfThings.slice();
    let returnarray = [];
    for(let count=1;count<numberOfItems;count++){
        let size = newarray.length
        let x = Math.floor(size*Math.random());
        returnarray.push(newarray.splice(x-1,1));
     }
     return returnarray;
}

答案 3 :(得分:0)

我认为如果它们是相同的话,你需要再次生成它

function generateRandomExcept(except, len, tries) { 
    if(tries >= len) 
        return null; 
    tries++;
    var num = Math.floor(Math.random() * len);
    return (num === except) ? generateRandom(min, max) : num;
}

答案 4 :(得分:0)

let items = [
  'i/itemname1.png',
  'i/itemname2.png',
  'i/itemname3.png'
];

/**
 * @param {Number} arr
 * @param {Number} n
 * @returns {Array} of length of n.
 */
function getRandomFromArray(arr, n) {
  // Getting a copy of an array.
  arr = arr.slice();
  // Removing elements from the array as long as there are not only required n elements left.
  while(arr.length > n) {
    // Randomly removing element from the array.
    arr.splice(Math.floor(Math.random() * arr.length), 1);
  }
  return arr;
}

// Returns an array consisting of 2 elements.
getRandomFromArray(items, 2);