Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MySQL] Rand z faworyzowaniem wyników
Watt
post
Post #1





Grupa: Zarejestrowani
Postów: 372
Pomógł: 1
Dołączył: 13.06.2008

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 1)
abort
post
Post #2





Grupa: Zarejestrowani
Postów: 590
Pomógł: 107
Dołączył: 25.10.2011

Ostrzeżenie: (0%)
-----


Da się. Wszystko "się da". (IMG:style_emoticons/default/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 (IMG:style_emoticons/default/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.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 23.08.2025 - 01:39