创建一个由唯一数字组成的数组
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'几次,你会看到你会得到不同的、不重复的随机数
我正在开发一个简单的游戏,允许用户从特定的猫中生成 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'几次,你会看到你会得到不同的、不重复的随机数