Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP]Zbyt wolny skrypt losowania
-emzetka-
post
Post #1





Goście







Witam. Mam problem ze skryptem losowania. Zrobiłem można powiedzieć "pseudo kod", bo na pewno nie jest to tak jak ma być. Chodzi mi mianowicie o wylosowanie trzech liczb z danego przedziału przy czym żadna z nich nie może być taka sama jak pozostałe. Dane powinny być zamieszczone w tablicy. Mi osobiście udało się to, bo kod działa, jednak nie wiem czemu, ale zależy na jakim serwerze. Na jednym jest wszystko ok, a na innym strona wczytuję się strasznie długo (biały ekran) aż wyświetla się błąd, że za długo musiał oczekiwać w jednej z linii kodu losowania.

Bardzo proszę o podpowiedź jak to powinno wyglądać aby działało szybko i nie sprawiało żadnych problemów ?
Oto kod:
  1. function losuj()
  2. {
  3. $randnum[0] = mt_rand(0, $this->numberofr);
  4.  
  5. do{
  6. $randnum[1] = mt_rand(0, $this->numberofr);
  7. }while($randnum[0] == $randnum[1]);
  8.  
  9. do{
  10. $randnum[2] = mt_rand(0, $this->numberofr);
  11. }while($randnum[2] == $randnum[1] || $randnum[0] == $randnum[2]);
  12.  
  13. return $randnum;
  14. }


Z góry dziękuję za odpowiedzi, pozdrawiam.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
gino
post
Post #2





Grupa: Zarejestrowani
Postów: 324
Pomógł: 52
Dołączył: 18.02.2008

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


Co przyjmuje zmienna $this->numberofr ?
Podstawiłem do tej funkcji liczby 10 cyfrowe i działa ok, wykonanie poniżej sekundy. Jak duże liczby przyjmuje ta zmienna ?

gino

@toaspzoo rand jest czterokrotnie wolniejsza od mt_rand

Ten post edytował gino 31.05.2011, 16:53:09
Go to the top of the page
+Quote Post
Zyggmunt
post
Post #3





Grupa: Zarejestrowani
Postów: 53
Pomógł: 0
Dołączył: 28.04.2009

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


Przypomniałem sobie, że mam jednak tutaj użytkownika.

Cytat(gino @ 31.05.2011, 17:50:12 ) *
Co przyjmuje zmienna $this->numberofr ?
Podstawiłem do tej funkcji liczby 10 cyfrowe i działa ok, wykonanie poniżej sekundy. Jak duże liczby przyjmuje ta zmienna ?


Przyjmuje liczbę wierszy pobraną z bazy mysql. Bardzo duża na pewno nie jest, pewnie trochę ponad 100.

Pozdrawiam.

P.s. Może dodam cały kod pliku (moduł ma za zadnie pobieranie danych z bazy mysql, które zapisał tam komponent DJ Catalog 2)

  1. <?php defined('_JEXEC') or die('Restricted access');
  2. class get_records
  3. {
  4. var $numberofr, $result;
  5.  
  6. function get_records()
  7. {
  8. $query="SELECT * FROM jos_djc2_items";
  9. $this->result = mysql_query($query);
  10. $this->numberofr = mysql_numrows($this->result); //number of rows
  11. $this->numberofr--;
  12. }
  13.  
  14. function get_datas()
  15. {
  16. $randomnumber = $this->losuj();
  17. for($i = 0 ; $i < 3 ; $i++)
  18. {
  19. $data[$i]["image"] = mysql_result($this->result, $randomnumber[$i], "image_url");
  20. $data[$i]["name"] = mysql_result($this->result, $randomnumber[$i], "name");
  21. $cat_id = mysql_result($this->result, $randomnumber[$i], "cat_id");
  22. $id = $randomnumber[$i] + 3;
  23. //$cat_id++;
  24. $data[$i]["link"] = 'index.php?option=com_djcatalog2&view=item&id='.$id.'&cid='.$cat_id.'&Itemid=568';
  25. $cat_id = $cat_id - 3;
  26. $query = "SELECT * FROM jos_djc2_categories";
  27. $result2 = mysql_query($query);
  28. $data[$i]["cat_name"] = mysql_result($result2, $cat_id, "name");
  29. }
  30.  
  31. return $data;
  32.  
  33. }
  34.  
  35. function losuj()
  36. {
  37. $randnum[0] = mt_rand(0, $this->numberofr);
  38.  
  39. do{
  40. $randnum[1] = mt_rand(0, $this->numberofr);
  41. }while($randnum[0] == $randnum[1]);
  42.  
  43. do{
  44. $randnum[2] = mt_rand(0, $this->numberofr);
  45. }while($randnum[2] == $randnum[1] || $randnum[0] == $randnum[2]);
  46.  
  47. return $randnum;
  48. }
  49.  
  50. }
  51. ?>



EDIT.

Już wszystko działa, przynajmniej u mnie. Nie wiem jednak dlaczego, ale osoba, której robię ten skrypt mówi, że na Firefoxie dalej mu nie działa (mimo, że u mnie wszystko jest ok na każdej przeglądarce).

Co może być tego przyczyną ?

Ma ktoś jakiś pomysł ?

Ten post edytował Zyggmunt 31.05.2011, 18:02:04
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 17.10.2025 - 13:40