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

question-closed losowe, bez powtórzeń

VPS Starter Arubacloud
–1 głos
582 wizyt
pytanie zadane 28 czerwca 2018 w JavaScript przez Tomasz Ozi Orzech Początkujący (300 p.)
zamknięte 28 czerwca 2018 przez Comandeer
<!DOCTYPE html>
<html lang="pl">
<head>

</head>
<body>
<script>


var dictionary = [];
var test = [];

var word1 = {
    baseWord: "angry",
    translation: "zły",
    baseKey: "pl",
    targetKey: "en"
};
add (word1);

var word2 = {
    baseWord: "happy",
    translation: "szczęśliwy",
    baseKey: "pl",
    targetKey: "en"
};
add (word2);


var word3 = {
    baseWord: "hate",
    translation: "nienawiść",
    baseKey: "pl",
    targetKey: "en"
};
add (word3);


var word4 = {
    baseWord: "bored",
    translation: "znudzony",
    baseKey: "pl",
    targetKey: "en"
};
add (word4);


var word5 = {
    baseWord: "excited",
    translation: "podniecony",
    baseKey: "pl",
    targetKey: "en"
};
add (word5);


var word6 = {
    baseWord: "love",
    translation: "miłość",
    baseKey: "pl",
    targetKey: "en"
};
add (word6);


var word7 = {
    baseWord: "sad",
    translation: "smutny",
    baseKey: "pl",
    targetKey: "en"
};
add (word7);


var word8 = {
    baseWord: "tired",
    translation: "zmęczony",
    baseKey: "pl",
    targetKey: "en"
};
add (word8);


var word9 = {
    baseWord: "scared",
    translation: "przestraszony",
    baseKey: "pl",
    targetKey: "en"
};
add (word9);



var word10 = {
    baseWord: "worried",
    translation: "zmartwiony",
    baseKey: "pl",
    targetKey: "en"
};
add (word10);



remove(word9);


function add(word){
    dictionary.push(word);
    //test.push(word);
}

function remove (samolot){
    dictionary.forEach(function (el,ind) {
        if(el===samolot){
            dictionary.splice(ind,1);
        }
    });
}



function getRandomWordFromDictionary() {
    var randomKey = Math.floor(Math.random() * (dictionary.length));
    return dictionary[randomKey];
}
console.log(getRandomWordFromDictionary())
console.log(getRandomWordFromDictionary())
console.log(getRandomWordFromDictionary())
console.log(getRandomWordFromDictionary())
console.log(getRandomWordFromDictionary())
console.log(getRandomWordFromDictionary())
console.log(getRandomWordFromDictionary())
console.log(getRandomWordFromDictionary())
console.log(getRandomWordFromDictionary())
console.log(getRandomWordFromDictionary())









</script>
</body>
</html>














to moj kod, jak zrobic zeby wynik losowania sie nie powtórzył....najlepiej jakby ktos pokazał, jak powinien wygladać kod oparty na moim kodzie . Dziekuje za pomoc...;)

2 odpowiedzi

+3 głosów
odpowiedź 28 czerwca 2018 przez Tomek Sochacki Ekspert (227,490 p.)
wybrane 28 czerwca 2018 przez Tomasz Ozi Orzech
 
Najlepsza

To może coś takiego:

function *randomElement(arr) {
    if (!Array.isArray(arr)) {
        throw Error('Invalid array!');
    }

    const data = [...arr];
    const max = data.length;

    const usedElementsIndexes = [];
    
    while(max !== usedElementsIndexes.length) {
        const randomIndex = ~~(Math.random()*max);
        if (usedElementsIndexes.includes(randomIndex)) {
           continue;
        }
        usedElementsIndexes.push(randomIndex);
        const randomElement = data[randomIndex];
        yield randomElement;
    }
}

// Tablica liter:
const randomLetters = randomElement(['a', 'b', 'c', 'd']);

randomLetters.next().value; // "c"
randomLetters.next().value; // "d"
randomLetters.next().value; // "a"
randomLetters.next().value; // "b"
randomLetters.next().value; // undefined

// Tablica liczb:
const randomDigits = randomElement([1,2,3,4,5]);

randomDigits.next().value; // 5
randomDigits.next().value; // 3
randomDigits.next().value; // 1
randomDigits.next().value; // 2
randomDigits.next().value; // 4
randomDigits.next().value; // undefined

Rozwiązanie to wykorzystuje generator, co wg mnie daje dwie zalety:

  1. jako argument przyjmujemy tablicę, której nie modyfikujemy na zewnątrz, czyli bazowa tablica daje pozostaje bez zmian, robimy kopię tablicy (zmienna "data"), co pozwala nam cały czas zachować bazową tablicę nienaruszoną, a dzięki temu możemy ją wykorzystywać też w innych miejscach. 
  2. mamy funkcję, którą możemy wykorzystywać jednocześnie dla kilku tablic, wystarczy stworzyć kilka niezależnych iteratorów.
  3. Ponad to kod można łatwo przerobić tak, aby po wypluciu wszystkich elementów z tablicy odtworzył ją i ponownie wyrzucał losowe elementy jeśli zajdzie taka potrzeba w kodzie, czyli np. masz tablicę 5 elementów, losujesz sobie je kolejno, a gdy wylosujesz wszystkie 5 to rozpoczynasz losowanie od nowa.

Jest to pewnie rozwiązanie, które nie do końca Cię zadowoli, przyznam, że zrobiłem je sobie w sumie w nieco innym celu (muszę wyjaśnić kilku osobom działanie generatorów no i nadarzyła się okazja do zrobienia jakiegoś przykładu :), ale proponuję też nie zakładać miliona wątków o tym samym... a ponad to nie musisz ładować na forum tak długiego kodu... Szukaj nie rozwiązania na gotowca ale pomysłu na rozwiązanie problemu... Twoje pytanie powinno więc brzmieć "Jak zrobić funkcję, która będzie losować elementy z tablicy tak, aby się nie powtarzały". I tyle, jedno zdanie... do tego wypadałoby napisać coś o warunkach dodatkowych jak to czy tablica ma być mutowana, co gdy wylosujesz wszystkie elementy itp.

komentarz 28 czerwca 2018 przez Tomasz Ozi Orzech Początkujący (300 p.)
Dziękuję bardzo za wyrozumiałość i pomoc :)
komentarz 28 czerwca 2018 przez ScriptyChris Mędrzec (190,190 p.)

@Tomek Sochacki, a'propos generatorów - pokazałeś dość praktyczny przykład ich wykorzystania. Czy możesz podać jeszcze kilka przypadków, gdzie użycie generatora będzie bardziej czytelne/lepsze niż pisanie kodu "na piechotę" (nie chodzi mi o pokazanie kodu, lecz o opis problemu i jakie zalety da zastosowanie generatora)? Nie miałem okazji używać generatorów, więc nie potrafię z nich korzystać - tyle, że wiem o ich istnieniu i mniej więcej orientuje się jak działają. Natomiast zastanawiam się, czy na tyle pomagają one w określonych problemach, żeby jednak bliżej im się przyjrzeć i "nauczyć obsługi"?

Dzięki.

1
komentarz 28 czerwca 2018 przez Tomek Sochacki Ekspert (227,490 p.)
Wiesz co, przyznam szczerze, że osobiście w sposób bezpośredni to rzadko stosowałem generatory w takiej postaci, aktualnie pracuję nad jedną apką do obliczeń inżynierskich w budownictwie i przyznam, że troszkę testuję sobie rozwiązanie z generatorami ale co z tego wyjdzie to się okaże za jakiś czas jak skończę (myślę, że napiszę co nie co o tych analizach na moim blogu).

Generalnie to w przypadku tego posta i w mojej apce pomyślałem o generatorach dlatego, że pozwalają w bardzo prosty sposób przyjąć jakiś obiekt jako argument (np. tablicę jak tutaj), zrobić jego kopię (tutaj prosto, ale przy obiektach zagnieżdżonych trzeba co nie co pokombinować) i wielokrotnie go używać i mutować bez wpływu na obiekt bazowy... który mogę wykorzystać w innej funkcji (np. innym generatorze). Ponad to pozwala mi wykonywać kolejne kroki w dowolnym momencie, np. tutaj generuję sobie kolejne losowe liczby gdy tego potrzebuję, wciąż mając w pamięci te już wylosowane (w mojej apce testuję to na przeplataniu się różnych wątków obliczeniowych, gdzie próbuję zamiast rekurencji wprowadzić kontrolowane pętle i kolejno wywoływać różne generatory, przekazując im wartości do dalszych kroków - w generatorach warto wiedzieć, że po wywołaniu jakiegoś next() możemy wprowadzić do generatora dodatkowe dane). Nie wiem jednak, czy to będzie faktycznie wydajniejsze niż rekurencja, bo w sumie caly czas trzymam w pamięci te "rozpoczęte" generatory ale jak mówiłem, jak poanalizuję to coś o tym naskrobię :)

A po za tym to jeśli dobrze pamiętam moją przygodę z React to chyba niektóre biblioteki do Reacta korzystały z generatorów, np. regux-saga ale nie jestem teraz pewien (osobiście korzystalem z redux-thunk a o sadze tylko trochę ze słyszenia wiem).

Trzeba jednak z umiarem stosować generatory bo nie zawsze wydajność może być faktycznie lepsza... np. jeśli korzystamy z transpilatora babel, gdzie generator jest w pewnym uproszczeniu transpilowany do zwykłej funkcji z rozbudowanym switch'em...

No i trzeba pamiętać o jeszcze jednym... Ja w tym przykładzie tworzę wewnętrznie kopię tablicy więc mógłbym stworzyć dwa niezależne iteratory przyjmujące tę samą tablicę i działalyby one niezależnie... Trzeba więc to przeanalizować czy faktycznie takiego zachowania oczekujemy... ale to są już niuanse zależne od konkretnych sytuacji.
komentarz 29 czerwca 2018 przez ScriptyChris Mędrzec (190,190 p.)

w mojej apce testuję to na przeplataniu się różnych wątków obliczeniowych, gdzie próbuję zamiast rekurencji wprowadzić kontrolowane pętle i kolejno wywoływać różne generatory, przekazując im wartości do dalszych kroków - w generatorach warto wiedzieć, że po wywołaniu jakiegoś next() możemy wprowadzić do generatora dodatkowe dane

 Brzmi ciekawie i ambitnie. Chętnie poczytam, gdy rozpracujesz ten temat. :)

+1 głos
odpowiedź 28 czerwca 2018 przez RafalS VIP (122,820 p.)
Nie chce nic mówić, ale doslownie 3 tematy nizej:

https://forum.pasja-informatyki.pl/361610/losowanie-slow-bez-powtorzen
komentarz 28 czerwca 2018 przez Tomasz Ozi Orzech Początkujący (300 p.)
Wiem, tylko, że nikt mi nie chce na kodzie tego pokazać ; (
3
komentarz 28 czerwca 2018 przez Benek Szeryf (92,810 p.)
No ja mogę na pseudokodzie, ale Ty nie chcesz. Przecież jak masz jakieś podstawowe pojęcie o programowaniu, to pseudokod powinien być dla Ciebie jak gotowiec. Poza tym zakładanie co chwilę wątku, bo Ci ludzie nie odpisują, nie jest dobrym wyjściem. Tylko sobie nagrabisz u moderacji, bo wprowadzasz chaos na forum.
komentarz 28 czerwca 2018 przez Chess Szeryf (76,710 p.)
Dokładnie, do pytań typu "ask to ask" jest raczej stworzony chat IRC aniżeli FORUM.
komentarz 28 czerwca 2018 przez Tomasz Ozi Orzech Początkujący (300 p.)
Luz, rozpedziłem się
komentarz 28 czerwca 2018 przez Comandeer Guru (605,680 p.)
To polecam zwolnić.

Podobne pytania

0 głosów
3 odpowiedzi 935 wizyt
pytanie zadane 28 czerwca 2018 w JavaScript przez Tomasz Ozi Orzech Początkujący (300 p.)
0 głosów
2 odpowiedzi 2,229 wizyt
0 głosów
1 odpowiedź 424 wizyt
pytanie zadane 9 października 2018 w C i C++ przez Gadzic Nowicjusz (170 p.)

93,079 zapytań

142,043 odpowiedzi

321,452 komentarzy

62,424 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

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...