Niepowtarzające się liczby w tablicy

0

Witam macie jakiś pomysł jak zrobić żeby liczby w tablicy randomNumbers się nie powtarzały ? Próbowałem jakiegoś porównywanie ale mi nie wychodzilo.

const randomNumberGenerator = document.querySelector('button');
const userNumbersValue = document.getElementById('userNumbers');
const addNumbers = document.getElementById('pushNumbers');
const drawnNumbers = document.querySelector('.lotek');
const removeNumbers = document.getElementById('removeNumbers');
const showUserNumbers = document.querySelector('.showUserNumbers');
const showUserNumbersInDiv = document.getElementById('showUserNumbersInDiv');
const hideUserNumbersInDiv = document.getElementById('hideUserNumbersInDiv');
const userHitsDiv = document.querySelector('.userHits');
// PRZYPISANIE DO TABLICY 49 LICZN
let lottoNumbers = [];
for (let i = 1; i < 50; i++) {
    lottoNumbers.push(i);
}
// PRZYPISANIE DO TABLICY USERA JEGO TYPOW
let userNumbers = [];
addNumbers.addEventListener('click', function () {
    userNumbers.push(parseInt(userNumbersValue.value));
});
// POKAZYWANIE TYPÓW USERA
showUserNumbersInDiv.addEventListener('click', function () {
    if (userNumbers.length == 0) {
        showUserNumbers.innerHTML = "Nic nie wytypowałeś";
    } else {
        showUserNumbers.innerHTML = userNumbers;
    }
});
// CHOWANIE TYPÓW USERA
hideUserNumbersInDiv.addEventListener('click', function () {
    showUserNumbers.innerHTML = "Schowane typy";
});
// USUNIĘCOE Z TABLICY USERA JEGO TYPOW
removeNumbers.addEventListener('click', function () {
    clearNumbers = confirm("Czy na pewno chcesz wyczyścić swoje typy?");
    if (clearNumbers == true) {
        userNumbers = [];
    };
});
// LOSOWANIE 6 RANDOMOWYCH LICZB Z TABLICY lottoNumbers
let randomNumbers = [];
randomNumberGenerator.addEventListener('click', function () {
    for (let i = 0; i < 6; i++) {
        let number = Math.round(Math.random() * (lottoNumbers.length - 1));
        randomNumbers.push(number);
        const div = document.createElement('div');
        div.textContent = number;
        drawnNumbers.appendChild(div);
    };
    // ZLICZANIE PUNKTOW USERA
    let hits = 0;
    randomNumbers.forEach((element) => {
        if (userNumbers.indexOf(element) !== -1) {
            hits++;
        };
    });
    // POKAZYWANIE PUNKTOW USERA W DIVIE
    const addUserHitsToP = document.createElement('p');
    userHitsDiv.textContent = hits;
    userHitsDiv.appendChild(addUserHitsToP);

});
0
if (randomNumbers.indexOf(number)!=-1) randomNumbers.push(number);

albo (jak chcesz wygenerować zadaną ilość liczb):

[było: let] var number = Math.round(Math.random() * (lottoNumbers.length - 1));
while (randomNumbers.indexOf(number)!=-1) {
  [było: let] var number = Math.round(Math.random() * (lottoNumbers.length - 1));
}

Tylko powyższa pętla może ci się zakleszczyć, np. jak zechcesz wygenerować 11 liczb z przedziału (1-10).

0

No racja, to nie zadziała dla let, bo let deklaruje zmienną lokalną obowiązującą wewnątrz bloku:

var number = Math.round(Math.random() * (lottoNumbers.length - 1));
while (randomNumbers.indexOf(number)!=-1) {
  var number = Math.round(Math.random() * (lottoNumbers.length - 1));
}

randomNumbers.indexOf(number) zwróci ci indeks wartości 'number' w tablicy 'randomNumbers' lub -1 jeśli wartość nie występuje w tablicy.

Pętla while będzie zatem powtarzana tak długo, dopóki wylosowana wartość nie będzie się dubletem którejś już istniejącej w tablicy.

1

Problem w wersji minimum:

let lottoNumbers = [];

for (let i = 1; i < 50; i++) {
    lottoNumbers.push(i);
}

let randomNumbers = [];

for (let i = 0; i < 6; i++) {
  var number = Math.round(Math.random() * (lottoNumbers.length - 1));
  while (randomNumbers.indexOf(number)!=-1) {
    var number = Math.round(Math.random() * (lottoNumbers.length - 1));
  }
  randomNumbers.push(number);
  console.log(number);
}

Nie widzę tu powtórzeń.

Natomiast mam dwie uwagi:

  • przyjęta metoda losowania generuje również zera,
  • do generowania liczb z zadanego przedziału nie potrzebujesz budować wcześniej tablicy liczb, wystarczy:
    Math.floor((Math.random() * 50) + 1);

1 użytkowników online, w tym zalogowanych: 0, gości: 1