创建一个由唯一数字组成的数组

Creating an array that is consisted of unique numbers

我正在开发一个简单的游戏,允许用户从特定的猫中生成 1 到 5 张猫图像 Api。然后,在单击开始按钮后,应用程序会生成这些猫的影子副本(低不透明度)。稍后游戏将拖动底部图像并将它们放入随机放置的影子副本(只有这样游戏才有意义)。然后我打算做一些更进一步的功能,比如时间计数器,积分等等。只是为了学习目的。

但我苦苦挣扎的是创建一个唯一的随机数(这将是特定猫的索引)并且在迭代期间不会重复...

这是代码

 const newArray = []; // 


const catsArrayList = [...catBoardCopy.querySelectorAll('.cat')] //Array with cat images

function randomizeIndex() { // randomize an index number
    let randomIndex = Math.floor((Math.random() * catsArrayList.length - 1) + 1);
    console.log(randomIndex);

    return randomIndex;
}

catsArrayList.forEach(catElement => { // here I am iterating over an array with cats which length is for example 5(this is max actually)

    newArray.push(catsArrayList[randomizeIndex()]); // and pushing those elements with randomly generated index to the new array

})

newArray.forEach(newCat => {

    shadowCatsContainer.appendChild(newCat); // here random cats are finally put to html container
})

所有这些工作直到其中一个随机数至少重复一次为止...当然,这实际上有 90% 的时间会发生。

我想这不会是一个简单的解决方案。我非常努力地让它使用不同的技术、不同的循环、不同的数组方法,什么都没有:(另外请注意我是初学者,所以我需要详尽的指导:)

祝你有愉快的一天。

一种选择是简单地随机排列数组:

const cats = ['Tigger', 'Smokey', 'Kitty', 'Simba', 'Sassy'];

function shuffle(array, n = 500) {
    const output = array.slice();
    for (let i = 0; i < n; ++i) {
        swap(output, getRandomInt(0, output.length), getRandomInt(0, output.length))
    }

    return output;
}

function swap(array, i, j) {
    const temp = array[i];
    array[i] = array[j];
    array[j] = temp;
}

function getRandomInt(min, max) {
    min = Math.ceil(min);
    max = Math.floor(max);
    return Math.floor(Math.random() * (max - min)) + min; //The maximum is exclusive and the minimum is inclusive
}

const shadowedCats = shuffle(cats);
console.log(cats);
console.log(shadowedCats);
console.log(shuffle(cats));

您的代码已关闭;您可以只从源数组中删除分配给新数组的项目,这样您就不会使用它两次。

const cats = [...catBoardCopy.querySelectorAll('.cat')]

function randomIndex() {
    return Math.floor(Math.random() * cats.length);
}

cats.forEach(catElement => {
    const index = randomIndex();
    shadowCatsContainer.appendChild(cats[index]);
    cats.splice(index, 1);
})

一个使用数组的例子。在这里,我创建了一个包含可能数字的数组,它从 0 到 'catsArrayList' 数组中包含的元素数。例如,如果 'catsArrayList' 有 3 个元素,则具有可能数字的数组将等于:[0, 1, 2]

现在的想法是从那个数组中抽取一个随机数,然后将其从列表中删除,然后我们可以继续重复这个过程,而不会得到重复的值。

例如

let catsArrayList = ['value1', 'value2', 'value3', 'value4', 'value5', 'value6'] // example


let numbers = [...Array(catsArrayList.length).keys()]
let lengthnumbers = numbers.length


for(let i = 1; i <= lengthnumbers; i++) {
  let randoms = Math.floor(Math.random() * numbers.length)
  console.log(i + 'º number: ' + numbers.splice(randoms, 1))
}

点击'Run code snippet'几次,你会看到你会得到不同的、不重复的随机数