• 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

Object Storage Arubacloud
0 głosów
247 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,300 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,300 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,300 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,150 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 3,154 wizyt
pytanie zadane 6 lipca 2020 w JavaScript przez szymek_irl Nowicjusz (150 p.)
0 głosów
1 odpowiedź 1,584 wizyt
pytanie zadane 3 kwietnia 2018 w JavaScript przez MrxCI Dyskutant (8,260 p.)
0 głosów
3 odpowiedzi 1,187 wizyt
pytanie zadane 17 marca 2017 w JavaScript przez bugs55 Obywatel (1,090 p.)

92,568 zapytań

141,420 odpowiedzi

319,618 komentarzy

61,954 pasjonatów

Motyw:

Akcja Pajacyk

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

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...