Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP] Jak wylosować przedmiot ?
Forum PHP.pl > Forum > Przedszkole
bartek4175
Witam! Nie wiem jak wylosować przedmiot z bazy. Każdy przedmiot w bazie ma określoną ilość % na wypadnięcie ( np: 50%, 0.01% ) razem wszystkie przedmioty mają 100% szansy. Teraz jak wylosować mogę wylosować przedmiot?
użyć funkcji random? Proszę o pomoc!
Fred1485
Podstawowe losowanie bym zrobił ładując wszystko do tablicy i potem:

  1. //ładujemy do tablicy $tablica
  2.  
  3. shuffle($tablica);
  4.  
  5. echo $tablica[0];


Ale to tylko podstawowe losowanie biggrin.gif
bartek4175
Cytat(Fred1485 @ 10.04.2015, 18:50:38 ) *
Podstawowe losowanie bym zrobił ładując wszystko do tablicy i potem:

  1. //ładujemy do tablicy $tablica
  2.  
  3. shuffle($tablica);
  4.  
  5. echo $tablica[0];


Ale to tylko podstawowe losowanie biggrin.gif

czyli jak?

  1. $tablica[0] = "Wpis numer 0";
  2.  
  3. każdy wpis na każdy przedmiot?
  4.  
trueblue
http://www.vcskicks.com/random-element.php
bartek4175
Cytat(trueblue @ 10.04.2015, 20:51:10 ) *

raczej kod do c# sie nie przyda tongue.gif

pomoze ktos z tą tablicą? tongue.gif
Kshyhoo
Cytat(bartek4175 @ 10.04.2015, 20:53:20 ) *
raczej kod do c# sie nie przyda tongue.gif

PHP jest pisane w C i jest bardzo podobne smile.gif Ponadto, zasada będzie taka sama...
bartek4175
Cytat(Kshyhoo @ 10.04.2015, 20:55:42 ) *
PHP jest pisane w C i jest bardzo podobne smile.gif Ponadto, zasada będzie taka sama...

dobra to zrobilem sobie:
  1. $random = rand(1,10000);

bo będę mial 0,001 nawet biggrin.gif

i teraz co dalej? bo nie rozumiem tam
Pyton_000
http://forum.php.pl/index.php?showtopic=173587
bartek4175
Cytat(Pyton_000 @ 10.04.2015, 21:11:50 ) *

nadal nie rozumiem biggrin.gif ma byc aby kazdy przedmiot z bazy losowalo tongue.gif
Pyton_000
Tak ale jedne będą częściej leciały a inne rzadziej. Dlatego musisz losować na podstawie prawdopodobieństwa.

Możesz też ew. pobrać wszystkie przedmioty.
Potem np. masz 100 przedmiotów.
Przedmiot A ma 50% szans na wypadnięcie. Więc duplikujesz ten przedmiot 50x (50% z 100 = 50).
Analogicznie reszta.
Potem po prostu losujesz z otrzymanej tablicy przedmiot.
trueblue
Jeśli z bazy, to: http://forum.php.pl/index.php?showtopic=239235
Przy czym jeśli wagi są poniżej 1, to musisz wagę każdego elementu pomnożyć przez liczbę dającą 1 dla najmniejszej wagi spośród wszystkich.
Tak więc w Twoim przypadku trzeba przemnożyć wszystkie wagi przez 100.
Potem losujesz z zapytania jeden rekord.
bartek4175
Cytat(trueblue @ 10.04.2015, 21:33:42 ) *
Jeśli z bazy, to: http://forum.php.pl/index.php?showtopic=239235
Przy czym jeśli wagi są poniżej 1, to musisz wagę każdego elementu pomnożyć przez liczbę dającą 1 dla najmniejszej wagi spośród wszystkich.
Tak więc w Twoim przypadku trzeba przemnożyć wszystkie wagi przez 100.
Potem losujesz z zapytania jeden rekord.

czyli jak mam to przerobić?
  1. SELECT e.event,e.probability FROM `events` AS e JOIN `events` AS e2 ON e.probability>=e2.probability

http://prntscr.com/6s59is


  1. SELECT e.event,e.probability FROM `skrzynki_itemy` AS e JOIN `events` AS e2 ON e.probability>=e2.probability



dobra a teraz jak to wyswietlic?

to nie daje nic ( pusto )
  1. $losowanie = mysql_query("SELECT e.nazwa,e.szansa FROM `skrzynki_itemy` AS e JOIN `skrzynki_itemy` AS e2 ON e.szansa>=e2.szansa") or die(mysql_error());
  2. echo $losowanie;
  3. echo "test";
  4. while($r = $losowanie){
  5. echo $r[nazwa];
  6. }
kpt_lucek
Sugerowałbym zainteresowanie się w MANUAL, a dokładnie sekcję opisującą jak wyciągać dane z BD (mysql), bo faktycznie, to co masz w obecnej chwili rekordów nie zwróci.
bartek4175
Cytat(kpt_lucek @ 10.04.2015, 22:15:13 ) *
Sugerowałbym zainteresowanie się w MANUAL, a dokładnie sekcję opisującą jak wyciągać dane z BD (mysql), bo faktycznie, to co masz w obecnej chwili rekordów nie zwróci.

tak zapomnialem o tym i zmienilem zaraz po dodaniu mojego posta ale teraz mam ciągle:
Losowy przedmiot: 123223123412345
kod:
  1. $losowanie = mysql_query("SELECT e.nazwa,e.szansa FROM `skrzynki_itemy` AS e JOIN `skrzynki_itemy` AS e2 ON e.szansa>=e2.szansa") or die(mysql_error());
  2. echo "Losowy przedmiot: ";
  3. while($r = mysql_fetch_array($losowanie)){
  4. echo $r[nazwa];
  5. }
Kshyhoo
  1. LIMIT 1

?
bartek4175
Cytat(Kshyhoo @ 10.04.2015, 22:32:17 ) *
  1. LIMIT 1

?

próbowałem, daje tylko 1
trueblue
ORDER BY RAND() LIMIT 1

Przemnożyłeś gdzieś prawdopodobieństwa wystąpienia elementów?
Jak obecnie wyglądają?
bartek4175
Cytat(trueblue @ 10.04.2015, 23:07:01 ) *
ORDER BY RAND() LIMIT 1

Przemnożyłeś gdzieś prawdopodobieństwa wystąpienia elementów?
Jak obecnie wyglądają?

nie mnozylem nic biggrin.gif teraz wygląda mi jakby losowało ale nie zważało uwagi na procenty

pomoze ktos?
Pyton_000
To najpierw naucz się czytać ze zrozumieniem co do Ciebie piszą. @Trueblue wyrażnie napisał że masz przemnożyć wagi x100
bartek4175
Cytat(Pyton_000 @ 11.04.2015, 10:08:50 ) *
To najpierw naucz się czytać ze zrozumieniem co do Ciebie piszą. @Trueblue wyrażnie napisał że masz przemnożyć wagi x100

jakie wagi:? biggrin.gif
trueblue
Wagi, to wartości, które przykładowo podałeś: 0,01%, 50%.
Pokaż przykładowe wartości, które masz w kolumnie przechowującej wagi.
bartek4175
Cytat(trueblue @ 11.04.2015, 10:28:04 ) *
Wagi, to wartości, które przykładowo podałeś: 0,01%, 50%.
Pokaż przykładowe wartości, które masz w kolumnie przechowującej wagi.

http://prntscr.com/6scmmv
trueblue
Nie musisz mnożyć wag, bo nie masz mniejszych od 1.
Przykład zapytania, które podałem działa dobrze dla ciągłych zakresów wag.
Ten będzie lepszy:
  1. SELECT event FROM events ORDER BY (RAND() * probability) DESC LIMIT 1
bartek4175
Cytat(trueblue @ 11.04.2015, 10:44:23 ) *
Nie musisz mnożyć wag, bo nie masz mniejszych od 1.
Przykład zapytania, które podałem działa dobrze dla ciągłych zakresów wag.
Ten będzie lepszy:
  1. SELECT event FROM events ORDER BY (RAND() * probability) DESC LIMIT 1

to co teraz dałem to dla testów tongue.gif będą tam wartości 0,01 smile.gif
trueblue
W tym zapytaniu nie musisz mnożyć.
bartek4175
Cytat(trueblue @ 11.04.2015, 10:46:33 ) *
W tym zapytaniu nie musisz mnożyć.

biała strona
  1. $losowanie = mysql_query("SELECT nazwa FROM skrzynki_itemy ORDER BY (RAND() * szansa) DESC LIMIT 1") or die(mysql_error());


// ok działa smile.gif poprostu mialem blad w innym kodzie
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.