В массиве есть цифры,добавить рандомную цифру так чтобы не повторялись
Eсть массив, в котором число будут добавлен при каждом клике , теперь мне нужно добавить oдин случайное число, которого нет в этом массиве и числа не должны повторяться, это должен работать при каждом клике.
в результате этого кода бывает что повторяются.
let arr = [];
function number(e) {
let random = Math.floor(Math.random() * 9);
arr.push(e);
for (let i = 0; i < arr.length; i++) {
if (arr[i] == random) { random = Math.floor(Math.random() * 9); i = 0 }
}
arr.push(random);
}
Ответы (4 шт):
Автор решения: Lukas
→ Ссылка
function number() {
let unique = new Set();
while (unique.size < 9) {
unique.add(Math.floor(Math.random() * 9))
}
return [...unique];
}
console.log(number());
Вот без Set:
function number() {
let uniqueArr = [];
while (uniqueArr.length < 9) {
let num = Math.floor(Math.random() * 9);
!uniqueArr.some(item => item === num) ? uniqueArr.push(num) : "";
}
return uniqueArr;
}
console.log(number())
Добавление по одному элементу:
let uniqueArr = [];
function number() {
let num = Math.floor(Math.random() * 9);
while (uniqueArr.some(item => item === num)) {
num = Math.floor(Math.random() * 9);
}
uniqueArr.push(num);
}
number();
number();
number();
console.log(uniqueArr);
Автор решения: UModeL
→ Ссылка
Если я правильно понял логику, то должно быть так:
let arr = [];
function number() {
if (arr.length < 9) {
let random = Math.floor(Math.random() * 9);
while (arr.includes(random)) {
random = Math.floor(Math.random() * 9);
}
arr.push(random);
console.log(arr);
}
}
<button onclick="number()">+N</button>
Автор решения: teran
→ Ссылка
поскольку речь у вас о цифрах, то можно взять известный массив, выкинуть оттуда все, что есть в исходном, и взять значение по произвольному индексу.
function addRandom(arr){
const digits = [0,1,2,3,4,5,6,7,8,9]
.filter(d => !arr.includes(d));
const randIdx = Math.floor( Math.random()*digits.length);
return arr.push(digits[randIdx]), arr ;
}
console.log(addRandom([1,2,3]));
Автор решения: vp_arth
→ Ссылка
function shuffle(arr) {
let i = arr.length, ri;
while (0 !== i) {
ri = Math.floor(Math.random() * i);
i--;
[arr[i], arr[ri]] = [arr[ri], arr[i]];
}
return arr;
}
function generate(list) {
const rlist = shuffle(list.slice());
let i = 0;
return () => (i < rlist.length) ? rlist[i++] : null;
}
const number = generate(Array(9).fill().map((_, i) => i + 1));
for (let i=0; i < 10; ++i) {
console.log(number());
}