Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP]losowanie z wagami
elmozaur
post
Post #1





Grupa: Zarejestrowani
Postów: 518
Pomógł: 18
Dołączył: 21.07.2008

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


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





Grupa: Zarejestrowani
Postów: 253
Pomógł: 31
Dołączył: 30.03.2009
Skąd: Szczecin

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


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)

Ten post edytował celbarowicz 4.04.2011, 08:38:07
Go to the top of the page
+Quote Post
thek
post
Post #3





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




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.


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
celbarowicz
post
Post #4





Grupa: Zarejestrowani
Postów: 253
Pomógł: 31
Dołączył: 30.03.2009
Skąd: Szczecin

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


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.
Go to the top of the page
+Quote Post
thek
post
Post #5





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




@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ść?


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
celbarowicz
post
Post #6





Grupa: Zarejestrowani
Postów: 253
Pomógł: 31
Dołączył: 30.03.2009
Skąd: Szczecin

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


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.
Go to the top of the page
+Quote Post
thek
post
Post #7





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




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


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 22.08.2025 - 09:30