Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL] Rand z faworyzowaniem wyników
Forum PHP.pl > Forum > Przedszkole
Watt
Witam,

Mam baze z której pobieram wyniki sortując je losowo. W jednej z kolumn mam liczby (od 0 do 10 000) chciałbym losowo wybrać z tabeli rekordy, ale faworyzować te wyższe (żeby wyższych było więcej). Czy coś takiego jest możliwe?
abort
Da się. Wszystko "się da". smile.gif
Czasami trzeba tylko "troszkę" pogłówkować, a czasami - niestey - będzie potrzebna wyższa matematyka. Na szybko wymyśliłem prosty sposób:
1. Losujemy liczbę - nazwijmy ją A
2. Losujemy następną liczbę - tak długo, dopóki nie będzie większa niż A. Nazywamy ją B
3. mamy wybrane B, używamy.
4. Jeśli potrzebna nam jest następna liczba, to GOTO punkt 1 (sorry, nie mogłem się powstrzymać od użycia BASICowej instrukcji smile.gif )

Sposób bazuje na założeniu, że generator liczb pseudolosowych zakłada równomierny rozkład liczb w całym losowanym zakresie. Oczywiście nie do końca jest to prawdą. Jednak dla naszych rozważań myślę, że wystarczająco dobrze traktuje "losowość". Poniżej uwagi (dla uproszczenia załóżmy, że losujemy liczby od 0 (zero) do 999:

1. zauważmy, że w kiedy wylosowana liczba A jest "mała" (z początku zakresu nas interesujacego - powiedzmy, że to będzie 100), to tak naprawdę nie mamy pewności, jak wielka będzie liczba B (czy to będzie 101, czy 999). Jedyne co wiemy na pewno, to jest to, co wynika z naszego algorytmu: B będzie większe od A. Zawężamy więc pozornie zakres losowania do części całego zakresu (tu: od 101 do 999). Następuje więc to, czego chcesz: algorytm będzie faworyzował liczby większe.
2. W/w przykład operuje na liczbach całkowitych, ale to co napiszę, odnosi się także to liczb rzeczywistych z zakresu <0, 1) [zapis matematyczny], choć dla liczb całkowitych jest wyraźnej widoczne: może Ci się zdarzyć, że jako A wylosujesz liczbę 999. Jest to koniec zakresu. I co wtedy a liczbą B? No niestety, musisz przyjąć, że B=A, inaczej wejdziesz w pętlę nieskończoną. Tak prawdę mówiąc, to warto ten warunek zapisać łagodniej: jeśli A jest większe od N procent zakresu liczb, które nas interesują, to przyjmujemy B=A. Procent możesz przyjąć dowolny, zakładam, że 90% zakresu to dość rozsądna wartość.
3. Algorytm może słabo ukazywać to co potrzebujesz, o ile będziesz generował małe ciągi liczb (do 10-20 elementów)

No to masz algorytm wymyślony na kolanie - spróbuj go wdrożyć i poinformuj o efektach, jestem naprawdę ciekawy, czy coś takiego zadziała tak jak potrzebujesz.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.