我正在玩一个网络应用程序并遇到一个问题,生成两个不同的项目,避免两次获得相同的项目。
// 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();
使用此代码,我有机会获得两个相同的项目。 我需要一个解决方案来避免这种情况有什么想法吗?
答案 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);