Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]problem z funkcją rand
QoooQ
post 21.06.2010, 16:24:52
Post #1





Grupa: Zarejestrowani
Postów: 31
Pomógł: 3
Dołączył: 4.01.2008

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


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..
Go to the top of the page
+Quote Post
lepmajster
post 21.06.2010, 16:29:23
Post #2





Grupa: Zarejestrowani
Postów: 129
Pomógł: 24
Dołączył: 21.05.2010

Ostrzeżenie: (30%)
XX---


musisz 'zresetowac' randomizera winksmiley.jpg


--------------------
Naciśnij POMÓGŁ, jeśli mój post był pomocny :)
Go to the top of the page
+Quote Post
tehaha
post 21.06.2010, 16:30:33
Post #3





Grupa: Zarejestrowani
Postów: 1 748
Pomógł: 388
Dołączył: 21.08.2009
Skąd: Gdynia

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


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
Go to the top of the page
+Quote Post
jasin
post 21.06.2010, 16:37:53
Post #4





Grupa: Zarejestrowani
Postów: 142
Pomógł: 32
Dołączył: 21.08.2008
Skąd: Toruń

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


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. }


Ten post edytował jasin 21.06.2010, 16:38:28


--------------------
Go to the top of the page
+Quote Post
lepmajster
post 21.06.2010, 16:39:16
Post #5





Grupa: Zarejestrowani
Postów: 129
Pomógł: 24
Dołączył: 21.05.2010

Ostrzeżenie: (30%)
XX---


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

Ten post edytował lepmajster 21.06.2010, 16:40:34


--------------------
Naciśnij POMÓGŁ, jeśli mój post był pomocny :)
Go to the top of the page
+Quote Post
yevaud
post 21.06.2010, 16:47:46
Post #6





Grupa: Zarejestrowani
Postów: 471
Pomógł: 89
Dołączył: 29.07.2008
Skąd: Warszawa

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


The random number generator is seeded automatically.

uzyj mt_rand()
Go to the top of the page
+Quote Post
QoooQ
post 21.06.2010, 17:01:46
Post #7





Grupa: Zarejestrowani
Postów: 31
Pomógł: 3
Dołączył: 4.01.2008

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


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ę :|...
Go to the top of the page
+Quote Post
yevaud
post 21.06.2010, 17:08:03
Post #8





Grupa: Zarejestrowani
Postów: 471
Pomógł: 89
Dołączył: 29.07.2008
Skąd: Warszawa

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


w manualu php masz setki przykladow gdzie magluja wszelkie randomy na wiele sposobow, rzuc tam okiem rand
Go to the top of the page
+Quote Post
lepmajster
post 21.06.2010, 17:19:35
Post #9





Grupa: Zarejestrowani
Postów: 129
Pomógł: 24
Dołączył: 21.05.2010

Ostrzeżenie: (30%)
XX---


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

Ten post edytował lepmajster 21.06.2010, 17:21:12


--------------------
Naciśnij POMÓGŁ, jeśli mój post był pomocny :)
Go to the top of the page
+Quote Post
QoooQ
post 21.06.2010, 20:19:28
Post #10





Grupa: Zarejestrowani
Postów: 31
Pomógł: 3
Dołączył: 4.01.2008

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


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 :/..
Go to the top of the page
+Quote Post
lepmajster
post 21.06.2010, 20:44:56
Post #11





Grupa: Zarejestrowani
Postów: 129
Pomógł: 24
Dołączył: 21.05.2010

Ostrzeżenie: (30%)
XX---


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.

Ten post edytował lepmajster 21.06.2010, 20:49:00


--------------------
Naciśnij POMÓGŁ, jeśli mój post był pomocny :)
Go to the top of the page
+Quote Post
bolverk
post 21.06.2010, 21:17:03
Post #12





Grupa: Zarejestrowani
Postów: 57
Pomógł: 6
Dołączył: 10.08.2009
Skąd: Nowe Miasto Lubawskie

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


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.


--------------------
Użytkownicy jak życie, wszystkim mogą cię zaskoczyć.
Go to the top of the page
+Quote Post
QoooQ
post 22.06.2010, 11:37:40
Post #13





Grupa: Zarejestrowani
Postów: 31
Pomógł: 3
Dołączył: 4.01.2008

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


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
Go to the top of the page
+Quote Post
lepmajster
post 22.06.2010, 11:48:43
Post #14





Grupa: Zarejestrowani
Postów: 129
Pomógł: 24
Dołączył: 21.05.2010

Ostrzeżenie: (30%)
XX---


Z tym sie zgadzam, ale jest to nadal mozliwe - choc MOCNO podejrzane winksmiley.jpg
Tak czy siak, fajnie ze rozwiazales ten problem.
Pozdrawiam


--------------------
Naciśnij POMÓGŁ, jeśli mój post był pomocny :)
Go to the top of the page
+Quote Post
QoooQ
post 22.06.2010, 12:15:57
Post #15





Grupa: Zarejestrowani
Postów: 31
Pomógł: 3
Dołączył: 4.01.2008

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


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 ?
Go to the top of the page
+Quote Post
lepmajster
post 22.06.2010, 12:19:25
Post #16





Grupa: Zarejestrowani
Postów: 129
Pomógł: 24
Dołączył: 21.05.2010

Ostrzeżenie: (30%)
XX---


To cie zainteresuje.
http://matipl.pl/2007/04/02/rand-w-sql/
Tam koles wlasnie zrobil tak, aby bylo bardziej unikatowe w SQL.


--------------------
Naciśnij POMÓGŁ, jeśli mój post był pomocny :)
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 Wersja Lo-Fi Aktualny czas: 27.04.2024 - 01:03