losowanie pytań testowych
losowanie pytań testowych
Mam problem z programem. Posiadam plik txt z pytaniami. Chciałbym aby program zaimportował plik z pytaniami, a następnie wylosował 10 losowych pytań i je wyświetlił lub zwrócił do nowego pliku txt lub csv. Chwilowo uploaduje plik i wrzucam w array który wyświetla cały zakres bazy? Proszę o pomoc bo nie mam pomysł co zrobić dalej. W załączniku wrzucam pliki.
- Załączniki
-
- baza_pytan.txt
- (17.17 KiB) Pobrany 505 razy
-
- projekt_losowanie_pytan_egzaminacyjnych.vi
- (9.07 KiB) Pobrany 496 razy
- Pitol
- Moderator
- Posty: 986
- Rejestracja: 19 lip 2007 00:00
- Wersja środowiska: LabVIEW 2019
- Lokalizacja: Kraków
Re: losowanie pytań testowych
Nie mam pod ręką LabVIEW, żeby obejrzeć Twój kod ale dam Ci radę na start.
Skorzystaj z bloczka Random Number. Zwraca on wartość losową w zakresie od 0-1.
Skoro jesteś w stanie załadować plik z pytaniami do tablicy to również jesteś w stanie określić jej rozmiar (ilość pytań).
Mnożysz teraz ten rozmiar tablicy z otrzymaną losową liczbą a następnie zaokrąglasz (sprawdź, w którą stronę zaokrąglać, żeby uwzględnić pełny zakres).
Otrzymasz teraz "losowy" numer pytania.
Teraz pozostaje Ci tylko zrobić to 10 razy w pętli.
Oczywiście nie zapomnij uwzględnić przypadku, że pytanie zostało już wylosowane.
Jeśli będziesz miał z tym problem daj znać, pomożemy.
Skorzystaj z bloczka Random Number. Zwraca on wartość losową w zakresie od 0-1.
Skoro jesteś w stanie załadować plik z pytaniami do tablicy to również jesteś w stanie określić jej rozmiar (ilość pytań).
Mnożysz teraz ten rozmiar tablicy z otrzymaną losową liczbą a następnie zaokrąglasz (sprawdź, w którą stronę zaokrąglać, żeby uwzględnić pełny zakres).
Otrzymasz teraz "losowy" numer pytania.
Teraz pozostaje Ci tylko zrobić to 10 razy w pętli.
Oczywiście nie zapomnij uwzględnić przypadku, że pytanie zostało już wylosowane.
Jeśli będziesz miał z tym problem daj znać, pomożemy.
- Pitol
- Moderator
- Posty: 986
- Rejestracja: 19 lip 2007 00:00
- Wersja środowiska: LabVIEW 2019
- Lokalizacja: Kraków
Re: losowanie pytań testowych
Kolego pawhan11, powiedz mi jaki sens ma Twój post z dydaktycznego punktu widzenia?
Autor wątku, wnioskując po załączonym VI, ma nikłe pojęcie o LabVIEW.
Twoje rozwiązanie zawiera Varianty, trochę logiki, sporo pętli... Czy uważasz, że osoba, która nie ma pojęcia o LabVIEW zrozumie ten kod?
Jeśli jeszcze zamieściłbyś jakiś opis tego co zrobiłeś, tak, żeby autor wątku miał chociaż szansę zrozumieć ten kod, to nie miałbym żadnych obiekcji.
Autor wątku, wnioskując po załączonym VI, ma nikłe pojęcie o LabVIEW.
Twoje rozwiązanie zawiera Varianty, trochę logiki, sporo pętli... Czy uważasz, że osoba, która nie ma pojęcia o LabVIEW zrozumie ten kod?
Jeśli jeszcze zamieściłbyś jakiś opis tego co zrobiłeś, tak, żeby autor wątku miał chociaż szansę zrozumieć ten kod, to nie miałbym żadnych obiekcji.
- smiga
- Administrator
- Posty: 823
- Rejestracja: 04 paź 2009 12:41
- Wersja środowiska: LabVIEW 2019
- Lokalizacja: Słupsk
Re: losowanie pytań testowych

Przykład jak można skomplikować coś prostego. Kolega nie sprawdził chyba ile razy wykonuje się ta pętla dla małych wartości, np.:
NumbersToGenerate=5, Low=0, High=5 ... nawet 20 razy potrafi się przekręcić! Temat jest prostym losowaniem lotto (np.6z49) czyli kombinacje bez powtórzeń. Dodatkowo mamy w tym kodzie drobny problem, jakim jest losowanie pełnego zakresu, czyli np. NumbersToGenerate=7, Low=2, High=8 ... powinien losować 7 liczb, a losuje 6.
Proponuję Koledze pawhan11 zerknąć na poniższe porównanie dwóch wersji rozwiązań - czy wersja 2 (pod kreską

-
- Posty: 641
- Rejestracja: 31 gru 2010 01:36
- Wersja środowiska: LabVIEW 2017
- Lokalizacja: Katowice
Re: losowanie pytań testowych
smiga, nadal za skomplikowanie...
)
(nie rozumiem jeszcze, jak z treści pierwotnego zadania wynikają w ogóle jakieś kontrolki "High" i "Low", ale nie będę wnikał

- smiga
- Administrator
- Posty: 823
- Rejestracja: 04 paź 2009 12:41
- Wersja środowiska: LabVIEW 2019
- Lokalizacja: Słupsk
Re: losowanie pytań testowych
Pobawmy się dalej - czyli sprawdźmy "performance" każdej z wersji.
Wynika z testów, że wersja 2 jest najszybsza, dla losowania kilku zadań (w praktyce tak się to chyba najczęściej dzieje) z puli (mniejszej lub większej). Natomiast wersja 3 zaczyna wygrywać przy kilkudziesięciu zadaniach z puli (czas potrzebny na wywołanie zewnętrznej dll, która jest w środku tej funkcji, już zaczyna się opłacać). Wersja 2 i 3 dają w sumie całkiem podobne czasy ( na poziomie 10-5...10-6 s, oczywiście zależnie od komputera). Wersja 1 zazwyczaj jest kilka razy wolniejsza.
Wersaja 3 jest oczywiście najbardziej elegancka, ale metodycznie niczego nie uczy ... prócz umiejętności wykorzystywania gotowych funkcji z LabVIEW, co właściwie jest bardzo ważne, bo znacznie przyśpiesza proces tworzenia oprogramowania
;)
Wynika z testów, że wersja 2 jest najszybsza, dla losowania kilku zadań (w praktyce tak się to chyba najczęściej dzieje) z puli (mniejszej lub większej). Natomiast wersja 3 zaczyna wygrywać przy kilkudziesięciu zadaniach z puli (czas potrzebny na wywołanie zewnętrznej dll, która jest w środku tej funkcji, już zaczyna się opłacać). Wersja 2 i 3 dają w sumie całkiem podobne czasy ( na poziomie 10-5...10-6 s, oczywiście zależnie od komputera). Wersja 1 zazwyczaj jest kilka razy wolniejsza.
Wersaja 3 jest oczywiście najbardziej elegancka, ale metodycznie niczego nie uczy ... prócz umiejętności wykorzystywania gotowych funkcji z LabVIEW, co właściwie jest bardzo ważne, bo znacznie przyśpiesza proces tworzenia oprogramowania

Re: losowanie pytań testowych
Jak już mowa o wydajności to chętnie się dołączę 
Można jeszcze co nieco uzyskać unikając przede wszystkim dynamicznego alokowania tablic, używając prostych typów danych i ograniczając ilość zapisów do pamięci.
W ten sposób uzyskujemy całkiem sporą przewagę nad rozwiązaniem 2. Przy zakresie 0-100000 i losowaniu 100 liczb wersja 2 trwa 13.35ms a rozwiązanie poniżej 0.01ms, czyli jakieś 1300x szybciej
Warunki przed casem są zabezpieczeniem o które trzeba dbać przy algorytmach używających pętli while, by się nam nie zakręciła w nieskończoność. ;)

Można jeszcze co nieco uzyskać unikając przede wszystkim dynamicznego alokowania tablic, używając prostych typów danych i ograniczając ilość zapisów do pamięci.
W ten sposób uzyskujemy całkiem sporą przewagę nad rozwiązaniem 2. Przy zakresie 0-100000 i losowaniu 100 liczb wersja 2 trwa 13.35ms a rozwiązanie poniżej 0.01ms, czyli jakieś 1300x szybciej

Warunki przed casem są zabezpieczeniem o które trzeba dbać przy algorytmach używających pętli while, by się nam nie zakręciła w nieskończoność. ;)
- smiga
- Administrator
- Posty: 823
- Rejestracja: 04 paź 2009 12:41
- Wersja środowiska: LabVIEW 2019
- Lokalizacja: Słupsk
Re: losowanie pytań testowych
Brawo Adrian47, brawo Pawhan11.
Całkiem fajny wątek nam wyszedł, z tego zadania wrzuconego przez bury666 - dziękuję za wspólną zabawę
Całkiem fajny wątek nam wyszedł, z tego zadania wrzuconego przez bury666 - dziękuję za wspólną zabawę

- smiga
- Administrator
- Posty: 823
- Rejestracja: 04 paź 2009 12:41
- Wersja środowiska: LabVIEW 2019
- Lokalizacja: Słupsk
Re: losowanie pytań testowych
Dla usystematyzowania wspólnych osiągnięć:
- smiga
- Administrator
- Posty: 823
- Rejestracja: 04 paź 2009 12:41
- Wersja środowiska: LabVIEW 2019
- Lokalizacja: Słupsk
Re: losowanie pytań testowych
Wyniki poniżej:
- smiga
- Administrator
- Posty: 823
- Rejestracja: 04 paź 2009 12:41
- Wersja środowiska: LabVIEW 2019
- Lokalizacja: Słupsk
Re: losowanie pytań testowych
Jak widać z wersją 3 jest coś nie tak ... czyli źle działa. Wersja 4 czasami losuje jedno 0.
Re: losowanie pytań testowych
Wersja 3 generuje tablicę przemieszanych liczb o zadanej wielkości w zakresie równym wielkości tej tablicy, dodatkowo dodaje do każdego elementu wartość 'start' (co widać jak się do niej zajrzy), czyli sprawdzi się jak chcemy po prostu przemieszać liczby.
Aby działała zgodnie z resztą algorytmów trzeba generować tablicę w całym zakresie Low-High, i wycinać z niej "NumbersToGenerate" na przykład tak:
Aby działała zgodnie z resztą algorytmów trzeba generować tablicę w całym zakresie Low-High, i wycinać z niej "NumbersToGenerate" na przykład tak: