![]() |
![]() |
![]()
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? |
|
|
![]() |
![]()
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. |
|
|
![]() ![]() |
![]() |
Aktualny czas: 23.08.2025 - 01:39 |