[PHP]problem z funkcją rand |
[PHP]problem z funkcją rand |
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..
|
|
|
21.06.2010, 16:29:23
Post
#2
|
|
Grupa: Zarejestrowani Postów: 129 Pomógł: 24 Dołączył: 21.05.2010 Ostrzeżenie: (30%) |
musisz 'zresetowac' randomizera
-------------------- Naciśnij POMÓGŁ, jeśli mój post był pomocny :)
|
|
|
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
|
|
|
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
Ten post edytował jasin 21.06.2010, 16:38:28 -------------------- |
|
|
21.06.2010, 16:39:16
Post
#5
|
|
Grupa: Zarejestrowani Postów: 129 Pomógł: 24 Dołączył: 21.05.2010 Ostrzeżenie: (30%) |
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 Ta funkcja powoduje to, ze wylosowane liczby beda jak najbardziej LOSOWE Ten post edytował lepmajster 21.06.2010, 16:40:34 -------------------- Naciśnij POMÓGŁ, jeśli mój post był pomocny :)
|
|
|
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() |
|
|
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ę :|... |
|
|
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
|
|
|
21.06.2010, 17:19:35
Post
#9
|
|
Grupa: Zarejestrowani Postów: 129 Pomógł: 24 Dołączył: 21.05.2010 Ostrzeżenie: (30%) |
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++ Pisze ogolnie, nie jestem specem - poprostu tak to rozumiem Ten post edytował lepmajster 21.06.2010, 17:21:12 -------------------- Naciśnij POMÓGŁ, jeśli mój post był pomocny :)
|
|
|
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 :/..
|
|
|
21.06.2010, 20:44:56
Post
#11
|
|
Grupa: Zarejestrowani Postów: 129 Pomógł: 24 Dołączył: 21.05.2010 Ostrzeżenie: (30%) |
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 :/.. 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 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 :)
|
|
|
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ć.
|
|
|
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 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 !
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!) |
|
|
22.06.2010, 11:48:43
Post
#14
|
|
Grupa: Zarejestrowani Postów: 129 Pomógł: 24 Dołączył: 21.05.2010 Ostrzeżenie: (30%) |
Z tym sie zgadzam, ale jest to nadal mozliwe - choc MOCNO podejrzane
Tak czy siak, fajnie ze rozwiazales ten problem. Pozdrawiam -------------------- Naciśnij POMÓGŁ, jeśli mój post był pomocny :)
|
|
|
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ć czy mysql jakoś inaczej funkcjonuje ?
|
|
|
22.06.2010, 12:19:25
Post
#16
|
|
Grupa: Zarejestrowani Postów: 129 Pomógł: 24 Dołączył: 21.05.2010 Ostrzeżenie: (30%) |
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 :)
|
|
|
Wersja Lo-Fi | Aktualny czas: 27.04.2024 - 01:03 |