#javascript #programowanie #algorytmy
Mireczki, mam problem. Potrzebuje funkcji (w javascript ale w sumie bardziej o algorytm niż konkretną implementacje się rozchodzi, więc może być inny język/pseudokod) która wygeneruje mi losową liczbę z zakresu od MIN do MAX ale nie jako trzeci parametrz przekazuję tablice numberów EXCLUDE i żaden z numerów z EXCLUDE nie może wystąpić w wyniku.
tzn. np:
randomExclude( 1 , 10 , [ 3,5] );
powinno wygenerować losową liczbę z zakresu od 1 do 10 ale nie może to być 3 i 5.
I teraz myk polega na tym, te tablice będą bardzo pojemne (setki tysięcy rekordów), więc bawimy się bez while itp. Tzn. te dwie koncepcje odrzucam:
a) wygenerowanie arraya dopuszczalnych wyników i potem pobrach randomowy losowego elementu
b) losowanie while( wynik jest w odrzuconych ) { powtorz probe; }
Mam obecnie taką funkcję:
http://pastebin.com/YfpsmTyU
Tzn. jak potrzebuje liczby od 1 do 10 ale wyłączając [3,5] to generuje liczbę od 1 do 8 i w przypadku wylosowania liczby większej niż 3 dodaje +1 ("przekręcam" na kolejną) a w przypadku 5 dodaje +2. Ale funkcja działa poprawnie tylko gdy jest jedna wartość w exlude, przy 2+ nie działa. Czuje że idę dobrą drogą ale brakuje mi jakiegoś małeog kawałka w tym, dlatego zwracam się do Was o pomoc :)
Mireczki, mam problem. Potrzebuje funkcji (w javascript ale w sumie bardziej o algorytm niż konkretną implementacje się rozchodzi, więc może być inny język/pseudokod) która wygeneruje mi losową liczbę z zakresu od MIN do MAX ale nie jako trzeci parametrz przekazuję tablice numberów EXCLUDE i żaden z numerów z EXCLUDE nie może wystąpić w wyniku.
tzn. np:
randomExclude( 1 , 10 , [ 3,5] );
powinno wygenerować losową liczbę z zakresu od 1 do 10 ale nie może to być 3 i 5.
I teraz myk polega na tym, te tablice będą bardzo pojemne (setki tysięcy rekordów), więc bawimy się bez while itp. Tzn. te dwie koncepcje odrzucam:
a) wygenerowanie arraya dopuszczalnych wyników i potem pobrach randomowy losowego elementu
b) losowanie while( wynik jest w odrzuconych ) { powtorz probe; }
Mam obecnie taką funkcję:
http://pastebin.com/YfpsmTyU
Tzn. jak potrzebuje liczby od 1 do 10 ale wyłączając [3,5] to generuje liczbę od 1 do 8 i w przypadku wylosowania liczby większej niż 3 dodaje +1 ("przekręcam" na kolejną) a w przypadku 5 dodaje +2. Ale funkcja działa poprawnie tylko gdy jest jedna wartość w exlude, przy 2+ nie działa. Czuje że idę dobrą drogą ale brakuje mi jakiegoś małeog kawałka w tym, dlatego zwracam się do Was o pomoc :)
- Najlepsze
- Wszystkie komentarze



![Uruchamiamy MC1204, słynny zegar z CEMI [TOWARY MODNE 342]](https://wykop.pl/cdn/c3397993/b33a8984ac77ff1580146bacb751bc760a61ba1a747dc2e69088be2db43660ed,q80.jpg)


Koncepcyjnie to losujesz z tablicy min - max z usuniętymi liczbami z exclude. Wydajnie będzie to tak:
losujesz liczbę od min do max-len(exclude)
sprawdzasz, ile jest liczb w exclude mniejszych lub równych od wylosowanej (złożoność lg n, tablica exclude musi być wcześniej posortowana).
dodajesz do wylosowanej liczby tę
Komentarz usunięty przez autora
co do >= to chodzi o to że chciałem zrobić tak że w przypadku parametrów MIN=1 MAX=10 i EXCLUDE=[3] żeby wylosować liczbę od 1 do 9 i gdy jest większa lub równa 3 to podbić ją o 1 co spowoduje że zestaw wyników
faktycznie, kod ma identyczną logikę no i faktycznie tak samo nie działa :D
@larvaexotech: mniejsza równa od value, nie mniejsza?
dla potomnych pełna działająca funkcja:
http://pastebin.com/xtCzWzhb