Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Losowość
Forum PHP.pl > Forum > Przedszkole
kill15
Mam problem.
Używam funkcji rand:

  1. $osx = rand(1,5);
  2. $osy = rand(1,5);
  3. $osie = "$osx,$osy";
  4. echo $osie;
  5. $zap = mysql_num_rows(mysql_query("SELECT * FROM test WHERE oss='$osie'"));


i mam problem gdyż 1 miejsce może dostać 1 użytkownik.
no ale istnieje dość duża szansa że wypadnie 2 razy to samo miejsce.

5*5 = 25 - tyle jest miejsc - gdy ich braknie będą losowane z następnego zbioru.
co zrobić żeby liczby się nie powtarzały ale użytkownikowi musi przyznać unikalne liczby za pierwszym razem.
Czy jest możliwe aby mieliło aż do wylosowania unikalnych liczb??

Jeżeli jest taka możliwość to zapewne trzeba będzie to pętlą zrobić tak questionmark.gif no i jak to mniej więcej zrobić.
markonix
Zajęte miejsca musisz po prostu gdzieś zapisywać i gdy tabelka się zapełni do od zera (TRUNCUATE w SQL).
Robisz to faktycznie na zasadzie pętli z tym, że można to inaczej ponieważ będzie tu trochę niepotrzebnego zapętlania póki nie znajdzie wyniku.

Możesz zrobić tabele 25 miejsc i flagę czy zajęte.
Na poziomie bazy losujesz RAND() jedno i ustawiasz flagę na zajęte.
Gdy wszystkie zajęte to UPDATE flag na 0 i tak w kółko.
kill15
Cytat(markonix @ 17.04.2011, 00:40:56 ) *
Możesz zrobić tabele 25 miejsc i flagę czy zajęte.
Na poziomie bazy losujesz RAND() jedno i ustawiasz flagę na zajęte.
Gdy wszystkie zajęte to UPDATE flag na 0 i tak w kółko.


Sprawa jest tego typu że rekordów w bazie moze być nieskończenie wiele.
Dodatkowo one się łączą przed dojściem do bazy danych.
Więc chyba tylko pętla mi pozostała questionmark.gif
markonix
Ale mnie nie chodzi o tabele ze złożonymi zamówieniami ale osobną, pomocniczą, która będzie miała stałą liczbę wierszy 25 i będzie służyła wyłącznie do losowania.
Struktura:
|| combination(varchar) || used (tinyint) ||
|| 1,1 || 0
|| 1,2 || 1
|| 1.3 || 1

itd...
Potem SELECT combination WHERE used = 0 LIMIT RAND() itd.
kill15
Cytat(markonix @ 17.04.2011, 01:49:55 ) *
Ale mnie nie chodzi o tabele ze złożonymi zamówieniami ale osobną, pomocniczą, która będzie miała stałą liczbę wierszy 25 i będzie służyła wyłącznie do losowania.
Struktura:
|| combination(varchar) || used (tinyint) ||
|| 1,1 || 0
|| 1,2 || 1
|| 1.3 || 1

itd...
Potem SELECT combination WHERE used = 0 LIMIT RAND() itd.


Jeśli dobrze Cię rozumiem to do tabeli będą dodawane wiersze do 25 tak ? A następnie gdy zbiór sie skończy to kasowane ?
Następnie mam ściągnąć do zmiennej liczby z wartością 0 ? dobrze mówie ? ale jak tu randa wykorzystać mógłbyś podać jakiś przykład questionmark.gif
Bo czytam ,czytam i nie wiem do końca jak to zrobić ;/
markonix
Sam napisałeś, że liczba kombinacji to 5^2 czyli 25 tak więc tworzysz tabele z dwiema kolumnami jedna dla ciągów tekstowych (choć można to i numerycznie typu 11, 12 choć wtedy nie będzie to łatwe w rozszerzeniu gdyby liczba kombinacji się zwiększyła i byłby liczby dwucyfrowe), druga tinyint która będzie przechowywać informacje o tym czy dana kombinacja jest użyta (0 - nie, 1 - tak).

Uzupełniasz tabele, ręcznie albo pętlą wyłącznie raz i zostawiasz. Oczywiście wszystkie wartości na 0 (nieużyte).

No i losowanie odbywa się po stronie sql, nie PHP, za pomocą funkcji RAND() i LIMIT 1 - odsyłam do Google, prosta sprawa.
Musisz jedynie po wylosowaniu danej kombinacji np. 1,2 oznaczyć ją jako użytą (flagę ustawiasz na 1).
I tak losowania odbywają się aż do momentu gdy wszędzie są jedynki i musisz to wyłapać (albo przed losowaniem sprawdzasz ile jest wolnych, albo po losowaniu gdy nie zwróci Ci żadnej kombinacji). Robisz UPDATE na wszystkich wierszach (25) i ustawiasz znowu na 0.
kill15
Dzięki, rozjaśniłeś mi to już trochę smile.gif jutro się za to zabiorę bo dziś wycieńczony jestem
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.