• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Losowanie tablicy z jednokrotnym powtórzeniem

Aruba Cloud PRO i VPS, Openstack, VMWare, MS Hyper-V
0 głosów
187 wizyt
pytanie zadane 11 marca 2016 w JavaScript przez Jacek Woźniak Użytkownik (740 p.)
edycja 11 marca 2016 przez Jacek Woźniak
function wymieszaj() {
    for (i = 0; i < losuj.length; i++) {
        losuj[i] = Math.floor(Math.random() * 21);
        j = i;
        while (j >= 0) {
            if (losuj[i] === losuj[j - 1] || losuj[i] === 0) {
                losuj[i] = Math.floor(Math.random() * 21);
            } else {
                j--;
            }
        }
        if (losuj[i] === 20) {
            losuj[i] = 10;
        } else if (losuj[i] > 10) {
            losuj[i] = losuj[i].toString().charAt(1);
        }
    }
    return losuj;
}


Cześć :)
Zadanie jest takie - losowo rozmieścić w tablicy 20-elementowej wartości od 1-10 z jednokrotnym powtórzeniem.
Zmagam się z tym problemem już od tygodnia, chciałem go rozwiązać sam, ale już nie mam pomysłu :P
Sprawdzałem działanie poniższej funkcji, wypisując losuj[i] na każdym etapie, i czasami reaguje na powtórzenie, a czasami nie. Przykładowo zwraca ona takie liczby:
7,8,5,7,1,8,7,1,6,7,2,10,9,3,4,5,5,8,8,1
9,4,2,10,6,2,8,4,10,7,8,6,1,6,5,1,5,8,7,7
2,3,6,7,1,5,2,1,5,9,4,8,8,4,4,6,4,10,5,9

Wymyśliłem, że zrobię to w ten sposób: wylosuję liczby od 1 do 20 bez powtórzeń, a następnie pozamieniam liczby większe od 10 na jej drugą cyfrę. Przykładowo 12=2. W ten sposób otrzymam liczby od 1 do 10 z pojedynczym powtórzeniem.

Proszę o pomoc w znalezieniu błędu :)

Pozdrawiam

2 odpowiedzi

0 głosów
odpowiedź 11 marca 2016 przez ShiroUmizake Nałogowiec (46,390 p.)
Czym jest zmienna globalna j? A właściwie w czym jest problem?
komentarz 11 marca 2016 przez Jacek Woźniak Użytkownik (740 p.)
j jest zmienną lokalną pomocniczą, w tym miejscu jest pierwszy raz użyta. Służy tylko do tego, żeby móc jechać po indeksach tablicy nie zmieniając przy tym zmiennej i.

Powinienem ją chyba zadeklarować tuż przed pętlą for, prawda?

A problem polega na tym, że liczby w tablicy się powtarzają po 3-4 razy, przy czym chciałbym, żeby każda powtórzyła się tylko 2. A sam błędu nie mogę zlokalizować już od tygodnia :p
komentarz 11 marca 2016 przez ShiroUmizake Nałogowiec (46,390 p.)
Jeżeli nie jest nigdzie zadeklarowana, to tak. Nie, dopisz tylko var, javaScript będzie wiedział, że to zmienna. Nie rozumiem , dlaczego losujesz liczbę w warunku :D. Ogólnie, czy to nie jest jakieś zadanie z studiów xD?
komentarz 11 marca 2016 przez Jacek Woźniak Użytkownik (740 p.)
Nie chciałem po prostu jej deklarować z każdym przejściem pętli, więc zrobiłem to na samym początku programu. Teraz jeszcze problem powtórzeń w tablicy

Najpierw losuję liczbę, następnie w pętli while sprawdzam, czy któryś poprzedni element tablicy jest taki sam jak aktualny, czyli losuj[i]. Jeżeli jest taki sam, to losuję kolejny.

Tak jest według teorii, no ale w praktyce musi być inaczej, bo w końcu nie działa :D

A zadanie sobie sam wymyśliłem :D
komentarz 11 marca 2016 przez ShiroUmizake Nałogowiec (46,390 p.)
Nabiłeś mi ćwieka :d. Wiem, ze była funkcja sprawdzająca powtarzające się elementy, ale za nic nie mogę sobie przypomnieć xd.
0 głosów
odpowiedź 11 marca 2016 przez Janusz92 Bywalec (2,130 p.)
Napisałem taki skrypt: http://codepen.io/anon/pen/oxLaqR?editors=0012

Lecz nie jest to najbardziej optymalne rozwiązanie. Dodałem zmienną loops, która zlicza przejścia pętli.

Jeśli znacznie zwiększysz zmienną max, to efekty będą widoczne.
komentarz 11 marca 2016 przez Jacek Woźniak Użytkownik (740 p.)
function wymieszaj(losuj) {
    i = losuj.length;
    while (i) {
        losuj.push(losuj.splice(Math.round(Math.random() * (i - 1)), 1));
        i--;
    }
    return losuj;
}

jako losuj wrzucam tablicę [1, 1, 2, 2, 3, 3 ... 10, 10].

Znalazłem jeszcze krótszy kod, zastosowałem go u siebie i działa bardzo dobrze.

Także teraz mam dwie prośby:

1. Mógłby mi ktoś znaleźć błąd w moim kodzie w 1 poście

2. Mógłby ktoś opisać działanie funkcji .splice na powyższym przykładzie?

Podobne pytania

0 głosów
3 odpowiedzi 1,711 wizyt
pytanie zadane 6 lipca 2020 w JavaScript przez szymek_irl Nowicjusz (150 p.)
0 głosów
1 odpowiedź 1,061 wizyt
pytanie zadane 3 kwietnia 2018 w JavaScript przez MrxCI Dyskutant (8,280 p.)
0 głosów
3 odpowiedzi 1,121 wizyt
pytanie zadane 17 marca 2017 w JavaScript przez bugs55 Obywatel (1,090 p.)

89,727 zapytań

138,332 odpowiedzi

309,340 komentarzy

59,649 pasjonatów

Advent of Code 2022

Top 15 użytkowników

  1. 429p. - Argeento
  2. 427p. - nidomika
  3. 396p. - Mikbac
  4. 392p. - ssynowiec
  5. 390p. - Łukasz Eckert
  6. 387p. - TheLukaszNs
  7. 386p. - rucin93
  8. 382p. - Michal Drewniak
  9. 382p. - Marcin Harasimowicz
  10. 378p. - JMazurkiewicz
  11. 373p. - tokox
  12. 367p. - Jarosław Roszyk
  13. 362p. - adrian17
  14. 359p. - overcq
  15. 350p. - Mawrok
Szczegóły i pełne wyniki

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Sklep oferujący ćwiczenia JavaScript, PHP, rozmowy rekrutacyjne dla programistów i inne materiały

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...