Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 24 lip 2026, o 01:10


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 3 ] 
Autor Wiadomość
PostNapisane: 25 kwi 2015, o 20:04 
Offline
Użytkownik

Dołączył(a): 05 gru 2013
Posty: 246
Pomógł: 0

Potrzebuję jakiegoś sposobu na losowanie kilku liczb z niewielkiego przedziału (np. od 1 do 10) w taki sposób, żeby żadna z nich nie powtarzała się w serii. Innymi słowy chodzi o odpowiednik wyciągania piłeczek z pudełka, bez ponownego wkładania już wylosowanych.
Najbardziej oczywistym rozwiązaniem, jakie przychodzi mi do głowy jest zastosowanie zmiennej tablicowej, do której byłyby wpisywane wyniki poprzednich losowań, z którymi byłby porównywany najnowszy wynik. W przypadku zgodności losowanie byłoby powtarzane do skutku.

Może jednak da się to zrobić w jakiś prostszy sposób, bez ciągłego zapętlania programu porównaniami z liczbą, która już wystąpiła? W końcu szczególnie pod koniec serii taka sytuacja będzie normą.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 kwi 2015, o 20:47 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 12 sie 2013
Posty: 230
Lokalizacja: Zabrze
Pomógł: 17

Można tak:
- robisz tablicę liczb od 1 do 10
- losujesz pozycję w tablicy (0 do 9), w ten sposób masz pierwszą liczbę wylosowaną;
- zamienisz miejscami wylosowaną liczbę z ostatnią (pozycja 9)
- ponownie losujesz, ale już tylko pozycje 0 do 8 (jedną mniej)
- zamieniasz miejscami wylosowaną z przedostatnią pozycją (8)
itd. analogicznie.
Wynikiem tego masz wylosowane liczby w tablicy w odwrotnej kolejności, tzn. pierwsza wylosowana jest pod pozycją 9, druga - 8 itd. aż ostatnia wylosowana pod pozycją 0. Oczywiście ostatniego losowania dla jednej liczby nie robisz.
Podobnie można zrobić na wskaźnikach.
Mam nadzieję, że zrozumiale napisałem o co chodzi.

_________________
40-32:2=4!



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 kwi 2015, o 20:52 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 20 sie 2013
Posty: 795
Lokalizacja: Poznań
Pomógł: 59

Kiedyś miałem troszkę podobny problem. Rozwiązałem go tak, że miałem tablicę z wszystkimi możliwymi elementami, którą następnie tasowałem. Dokładniej wyglądało to tak, że zamieniałem elementy od 0 do rozmiar tablicy z losowym elementem z przedziału aktualny+1 do rozmiar tablicy. Do każdego tasowania było inne ziarno. Tak potasowana tablicy była już czytana po kolei - potrzebowałem 4 liczby losowe - wykorzystywałem elementy od 0 do 3. Dodatkowo można też zrobić tasowanie tylko tylu elementów, ile nam potrzeba, ale to już szczegół. Mam nadzieję, że to pomogło.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 3 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 1 gość


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO