Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]losowanie z wagami
Forum PHP.pl > Forum > Przedszkole
elmozaur
Witam

czy ktos moze naprowadzic mnie w pewnej kwestii.
chcialbym zrobic losowanie cyferek 0-9 ale tak aby cyferki 3,6,9 byly losowane czesciej (tak jakby bardziej promowane przy losowaniu)

samo losowanie moge zrobic mt_rand ale z tymi wagami to nie wiem jak ruszyc
celbarowicz
Użyj tablicy a[1]=9 , a[2]=9 a[3]=9 ,a[4]=3 , a[5]=3 , a[6]=1 ,a[7]=2......a[twój_koniec]=celbar.
Losuj z zakresu {1,2,3,...twój_koniec} i po wylosowaniu liczby przyporządkuj jej wartość z tablicy.
(przedziały,podzbiory)
thek
Celbarowicz... I w przypadku losowania spośród dajmy 10000 liczb też ma tak zrobić? wink.gif Tu się stosuje w takim wypadku "metodę tortu". Przyporządkowujesz liczbom domyślną wagę, przypuśćmy 1 i określonym mniejszą lub większą. Teraz z tego utworzy Ci się ładny wykres kołowy o wartościach od 0 do 1. Gdy wylosujesz jakąś liczbę, sprawdzasz w który "kawałek" trafiła. Największą trudność sprawia ludziom oznaczenie w co trafili. Ale to z reguły kwestia napisania sobie działania matematycznego i odrobiny przemyślenia jak liczby o zmienionych wagach zapisujemy oraz w jakiej kolejności w stosunku do tych z niezmienionymi.
celbarowicz
thek
Z jakiej ilości liczb będziesz losował w przypadku Twojego tortu?czy mniejszej niż podałeś? Czy przyporządkowanie wag(jeśli chodzi o ilość działań) nie jest tym samym co przyporządkowanie wartości z tablicy? Losowanie=trafienie w tort? Odczytanie jaka liczba została wylosowana = odczytywanie tortu?.(nawet gdy wykres jest już gotowy)
Pozdrawiam.
thek
@Celbarowicz: Jeśli zrobisz ileś liczb to w Twoim wykonaniu tracę informację o wagach w określinym momencie. Czemu? A co z wartościami mniejszymi od wartości bazowej?
Mamy sytuację, że mamy mieć po 1 razie 1,2,3, po 2 razy 4 i 3 razy 5. Co robimy w Twoim wypadku?
a[1] = 1, a[2] = 2, a[3] = 3, a[4] = 4, a[5] = 4, a[6] = 5, a[7] = 5, a[8] = 5
Fajnie. A teraz zmieniamy wagi do pół szansy na 1 smile.gif Co trzeba zrobić? Mnożyć wszystkie wagi razy 2 by ustandaryzować wszystkie tak, by najniższa wartość była 1, a wszystkie inne były wartościami naturalnymi. W efekcie mamy cudowne normalizowanie, które w przypadku wielu liczb zajmie ogrom czasu, bo musi utworzyć:
a[1] = 1, a[2] = 2, a[3] = 2, a[4] = 3, a[5] = 3, a[6] = 4, a[7] = 4, a[8] = 4, a[9] = 4, a[10] = 5, a[11] = 5, a[12] = 5, a[13] = 5, a[14] = 5, a[15] = 5

A co w przypadku tortu? Mogę się bawić jak chcę, bo i tak ostateczne 100% to suma wszystkich wag i mi się obliczenia normalizują "same". Twój kod więc jest nawet dla małych liczb niezbyt dobry jeśli wprowadzisz mniejsze niż 1 wartości wag. W trakcie normalizacji musisz wtedy taką wartość znaleźć, by znajdowało ewentualny najmniejszy całkowity mnożnik, który doprowadzi wszystkie ułamki do zmiany w liczby całkowite. Przykład? Masz wagę 0.5 i 0.6, a więc tak naprawdę wartością bazową nie będzie 1 ale inna wartość. Teraz powiesz mi jaki jest wzorek na ową wartość bazową i mnożnik, którym wszystkie liczby potraktować? Rozwiązanie Twoje jest po prostu bardzo nieodporne na modyfikacje i określanie wagi jako szacowanej względem wartości bazowej. Tu akurat jest proste rozwiązanie, bo na upartego zawsze można jako mnożnik przyjąć potęgę 10 taką, ktora pozbawia obie liczby części ułamkowej, a więc dla tego przypadku byłoby to 10 jako i mnożnik i wartość bazowa jednocześnie. Tak więc zamiast bazowej tablicy z kilkoma elementami masz już tablice z minimum kilkudziesięcioma, jesli tego nie optymalizujemy by szukał najmniejszej możliwej liczby, dla zaledwie może 5-6 liczb. Widzisz jak właśnie posypałeś wydajność?
celbarowicz
Ok thek.
Podałem rozwiązanie najprostsze. Nie wnikałem w dywagacje naukowe dzięki którym rozwiązanie staje się podatne na modyfikację.
Zainteresowani zapewne skorzystają z odpowiadających im wskazówek. A tak na marginesie to zajmę się kiedyś tym "tortem".
Pozdrawiam.
thek
Tort, w tym konkretnym przypadku, zwany czasem "kołem ruletki" to prosa rzecz. Bierzesz wszystkie wagi sumujesz i wagę dzielisz przez nią, a w ten sposób wiesz jak duzy masz kawałek tortu dla określonej wartości. Różnie natomiast ludzie podchodza do sprawy wskazania kawałka wylosowanego i formy zapisu liczb na kole ruletki. Tutaj pomysłów jest wiele i co programista to pewnie będzie miał inny wink.gif
Przykładowo bazowe jest 1 i ok, ale powiesz, że są to liczby 1, 2, 3 i 4 ma 2, 5 ma 3 a 6 ma 0.5 co daje sumaryczne 8.5, a więc wagi są:
1,2,3: 1/8.5 = 2/17
4: 2/8.5 = 4/17
5: 3/8.5 = 6/17
6: 0.5/8.5 = 1/17
Jak widzisz wielkości kawałków są banalne do uzyskania. Problem ludziom sprawia jak z liczby rand ( od 0 do 1 ) uzyskać co wylosowano. I w sumie jak wspomniałem trudno podać jeden algorytm, bo ludzie stosują ich wiele. Przykład? Zapisujemy jako klucze liczby, a jako wartości sumę wartości kawałka tortu oraz elementów poprzednich. Możemy jednak dla optymalizacji choćby posortować je od największych do najmniejszych wartości wag wcześniej. Ogólnie można tutaj kombinować smile.gif
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.