Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]problem z funkcją rand
Forum PHP.pl > Forum > Przedszkole
QoooQ
witam mam problem z funkcją rand.. losuje liczy np z przedziłu 1,60000 i bardzo często jest losowana liczba która już była wylosowana tak jak by ta liczba się 'keszowała' czy coś.. oczyiście taki problem nmam na komercyjnym serwerze -> linuxpl.com mógłby mi ktoś poradzić czy to błąd czy co albo w jaki inny sposób uzyskać jak najbardziej losowe liczby z danych przedziałów..
lepmajster
musisz 'zresetowac' randomizera winksmiley.jpg
tehaha
możesz po losowaniu wrzucać liczbę do tablicy, a potem funkcją in_array() sprawdzasz czy ta liczba została już wylosowana jeżeli tak to losujesz jeszcze raz, czyli pomocna będzie tu pętla while
jasin
Metoda zwraca tablicę n losowych liczb

  1. function uniqueRand($n, $min = 1, $max = 60000)
  2. {
  3. $array = range($min, $max);
  4. $return = array();
  5. $keys = array_rand($array, $n);
  6. foreach($keys as $key)
  7. {
  8. $return[] = $array[$key];
  9. }
  10.  
  11. return $return;
  12. }
lepmajster
Cytat(tehaha @ 21.06.2010, 17:30:33 ) *
możesz po losowaniu wrzucać liczbę do tablicy, a potem funkcją in_array() sprawdzasz czy ta liczba została już wylosowana jeżeli tak to losujesz jeszcze raz, czyli pomocna będzie tu pętla while

Jemu raczej chodzi o to, ze randomizer losuje mu te same liczby, tak samo jest w c++, trzeba przed losowaniem dac

Jakos tak winksmiley.jpg

Ta funkcja powoduje to, ze wylosowane liczby beda jak najbardziej LOSOWE winksmiley.jpg
yevaud
The random number generator is seeded automatically.

uzyj mt_rand()
QoooQ
mt_rand nic mi nie daje..

co do tego srand nie wiem co to daje ale zauważyłem że jeśli w ciągu 1 sek odświeżę str 2x to losuje tą samą liczbę :|...
yevaud
w manualu php masz setki przykladow gdzie magluja wszelkie randomy na wiele sposobow, rzuc tam okiem rand
lepmajster
Cytat(QoooQ @ 21.06.2010, 18:01:46 ) *
mt_rand nic mi nie daje..

co do tego srand nie wiem co to daje ale zauważyłem że jeśli w ciągu 1 sek odświeżę str 2x to losuje tą samą liczbę :|...

Widocznie tak jak pisal yevaud, w PHP randomizer jest automatycznie resetowany, wiec funkcja srand() nie ma sensu.
Ale do czego ona sluzy np w c++, ano rand() dziala na tej zasadzie, ze pobiera czas z jadra systemu i na tej podstawie generuje liczby losowe, ale ma to taka wade, ze ten czas pobierany jest tylko za pierwszym razem, wiec ciag liczb jest powtarzalny, dlatego ustawia sie randomizer reczenie srand(time()) przed kazdym wywolaniem rand(), gdzie time() to poprostu czas-> klucz wedlug ktorego sa losowane liczby, dlatego w ciagu tej 1sek masz te same liczby, ale jakbys dal w srand() np. czas co do 1 milisekundy, wtedy by ten problem zniknal.
Tak bylo w c++ smile.gif
Pisze ogolnie, nie jestem specem - poprostu tak to rozumiem smile.gif
QoooQ
yevaud , dzieki ale i tak nic z tych skryptow nie rozumiem , dodatkowo opisy po ang :/ czyli rozumiem że nie jestem w stanie nic zrobić aby liczby były bardziej losowa questionmark.gif :/..
lepmajster
Cytat(QoooQ @ 21.06.2010, 21:19:28 ) *
yevaud , dzieki ale i tak nic z tych skryptow nie rozumiem , dodatkowo opisy po ang :/ czyli rozumiem że nie jestem w stanie nic zrobić aby liczby były bardziej losowa questionmark.gif :/..

Ale jak libczy losowe, maja byc bardziej losowe? Tego nie rozumiem, jesli za kazdym razem maja byc inne, to juz to nie sa liczby losowe! Caly trik polega na tym ze nawet w duzym lotku dana liczba moze sie powtorzyc w nastepnym losowaniu winksmiley.jpg
Jesli liczby cala seria sie nie powtarzaja to nie masz problemu, a ze od czasu do czasu (nawet 3 razy z rzedu) ci sie jakas liczba powtorzy, no to coz ... zycie, przeciez jest jakies (male) prawdopodobienstwo ze tak sie moze stac.

Cos czuje ze chcesz zrobic skrypt do nadawania losowej nazwy czegos (powiedzmy pliku) i to cos nie moze sie powtarzac. Jesli tak to nie win rand() za to ze losuje ci liczby, ktore moga sie powtorzyc, w takim przypadku nalzey jeszcze zastosowac jakies warunki.
bolverk
Istnieje sposób żeby losowe liczby były rzeczywiście losowe. Na początku każdego skryptu gdzie używasz mt_rand do losowania liczb, wstaw sobie coś takiego:
Kod
mt_srand((double)microtime()*1000000);


Zapewniam że działa, sam z tego korzystam.
QoooQ
o wielkie dzięki wygląda na to że działa smile.gif wczoraj po tym co napisał lepmajster właśnie próbowałem kombinować z funkcja microtime ale nie wpadłem na takie rozwiązanie. wielkie dzięki smile.gif !

Ps
lepmajster nie , potrzebowałem napisać żeby jak najbardziej losową liczbę wybierał . owszem jest małe prawdopodobieństwo ale jeśli np dla usera 1 wylosował 5 dla usera 2 wylosował 5 to dziwne jest że co parę losowań tym userom wylosuje znowu te same liczby (a przedział wynosi 1,60000!) smile.gif
lepmajster
Z tym sie zgadzam, ale jest to nadal mozliwe - choc MOCNO podejrzane winksmiley.jpg
Tak czy siak, fajnie ze rozwiazales ten problem.
Pozdrawiam
QoooQ
jeszcze takie pytanko czy jeśli w zapytaniu używam RAND to czy to rozwiązanie wyżej też będzie działać questionmark.gif czy mysql jakoś inaczej funkcjonuje ?
lepmajster
To cie zainteresuje.
http://matipl.pl/2007/04/02/rand-w-sql/
Tam koles wlasnie zrobil tak, aby bylo bardziej unikatowe w SQL.
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.