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
aeaeae
post
Post #2





Grupa: Zarejestrowani
Postów: 117
Pomógł: 23
Dołączył: 5.03.2011

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


  1. do{
  2. $randnum[1] = mt_rand(0, $this->numberofr);
  3. }while($randnum[0] == $randnum[1]);


Tak się nie robi! (IMG:style_emoticons/default/thumbsdownsmileyanim.gif)
Co jakbyś miał losować w ten sposób 999'999 różnych liczb spośród 1'000'000? Teoretycznie ta pętla może się wykonywać w nieskończoność (a php ma mało czasu ...). Jasne, że dla podanego przykładu można zastosować inną metodę i wylosować jedną liczbę, którą się odrzuci, ale nie zawsze wiadomo co i z czego będzie losowane ...

Spróbuj tak (jeśli wynik może być posortowany, bo jeśli nie może to pokombinujemy dalej ...):
  1. <?php
  2. define('MAX',20); //>=1
  3. define('ILE',10); //ILE<=MAX
  4. for($i=0;$i<=ILE-1;$i++)
  5. {
  6. $t[$i]=rand(1,MAX-$i);
  7. for($j=0;$j<$i;$j++)
  8. if($t[$i]>=$t[$j])
  9. $t[$i]++;
  10. sort($t);
  11. }
  12. for($i=0;$i<=ILE-1;$i++)
  13. echo $t[$i].'<br />';
  14. ?>
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: 14.10.2025 - 23:36