Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]Losowanie bez zwracania
Aspire
post
Post #1





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 24.03.2011

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


Witam, chcę sobie wylosować 6 liczb (bez zwracania) z 49 - lotek (IMG:style_emoticons/default/wink.gif)
Napisałem taki skrypt:
  1. <?php
  2. $start = microtime(true);
  3. function losuj()
  4. {
  5. $t = range(1,49);
  6. $w = array_rand($t,6);
  7. foreach ($w as $l) { echo $l." "; }
  8. }
  9. for($i=1;$i<=10;$i++) { echo $i.") "; losuj(); echo "\n<br />"; }
  10. echo "<hr>";
  11. echo 'Czas generowania strony: ' . round(microtime(true) - $start, 3).'s';
  12. ?>

ale pomimo ustawienia zakresu od 1 do 49 często dostaję 0.
Np:
0 13 15 22 19 30
Dodam, że nie zauważyłem, żeby któraś z wylosowanych liczby wykraczała poza 49. Dlaczego tak się dzieje? Z góry dzięki (IMG:style_emoticons/default/wink.gif)
Ustawienie range(2,50) też nic nie daje ;/

Ten post edytował Aspire 21.04.2013, 18:01:34
Go to the top of the page
+Quote Post
Crozin
post
Post #2





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


array_rand zwraca losowe klucze, nie wartości z tablicy.
Go to the top of the page
+Quote Post
Aspire
post
Post #3





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 24.03.2011

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


A jak wylosować 6 liczb z zakresu 1-49?
Znalazłem taki skrypt:
  1. $tab = array(1,2,3,4,5,6,7,8,9,
  2. 10,11,12,13,14,15,16,17,18,19,20);
  3. $wynik = array();
  4. for($i=0;$i<10;$i++)
  5. {
  6. $lntab = count($tab)-1; /*zapisujemy długość tablicy - 1 ponieważ tablica
  7.   jest indeksowana domyślnie od 0, a count liczy od 1*/
  8. $r = mt_rand(0,$lntab); /*zapisujemy losową liczbę*/
  9. $wynik[] = $tab[$r]; /*dodajemy do tablicy wynikowej */
  10. $tab[$r] = $tab[$lntab]; /*w wylosowane miejsce przypisujemy
  11.   ostatni element z tablicy*/
  12. unset($tab[$lntab]); /*usuwamy ostatni element*/
  13. }
  14. sort($wynik); /*sortujemy*/
  15. print_r($wynik); /*wyrzucamy na ekran*/


Działa, ale chciałbym to zrobić bardziej "po mojemu".

Ten post edytował Aspire 21.04.2013, 18:31:59
Go to the top of the page
+Quote Post
sajegib
post
Post #4





Grupa: Zarejestrowani
Postów: 352
Pomógł: 59
Dołączył: 16.01.2013

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


ale co tu do robienia po twojemu? Możesz ten efekt osiągnąć na wiele sposobów, ale chodzi chyba o to, żeby działało?

  1. $tab = range(1,49); // ---> tutaj ustalasz liczby 1-49
  2. $wynik = array();
  3. for($i=0;$i<10;$i++)
  4. {
  5. $lntab = count($tab)-1; /*zapisujemy długość tablicy - 1 ponieważ tablica
  6.   jest indeksowana domyślnie od 0, a count liczy od 1*/
  7. $r = mt_rand(0,$lntab); /*zapisujemy losową liczbę*/
  8. $wynik[] = $tab[$r]; /*dodajemy do tablicy wynikowej */
  9. $tab[$r] = $tab[$lntab]; /*w wylosowane miejsce przypisujemy
  10.   ostatni element z tablicy*/
  11. unset($tab[$lntab]); /*usuwamy ostatni element*/
  12. }
  13. sort($wynik); /*sortujemy*/
  14. print_r($wynik); /*wyrzucamy na ekran*/
  15.  


Ten post edytował sajegib 21.04.2013, 18:34:51
Go to the top of the page
+Quote Post
lobopol
post
Post #5





Grupa: Zarejestrowani
Postów: 1 729
Pomógł: 346
Dołączył: 4.04.2009

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


array_rand na tablicy 50 elementowej rangem zrobionej z usuniętym 0 kluczem
Go to the top of the page
+Quote Post
Aspire
post
Post #6





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 24.03.2011

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


@lobopol dzięki, teraz działa jak trzeba (IMG:style_emoticons/default/wink.gif)
  1. <?php
  2. $start = microtime(true);
  3. function losuj()
  4. {
  5. $t = range(1,50);
  6. unset($t[0]);
  7. $w = array_rand($t,6);
  8. foreach ($w as $l) { echo $l." "; }
  9. }
  10. for($i=1;$i<=100;$i++) { echo $i.") "; losuj(); echo "\n<br />"; }
  11. echo "<hr>";
  12. echo 'Czas generowania strony: ' . round(microtime(true) - $start, 3).'s';
  13. ?>


Ten post edytował Aspire 21.04.2013, 18:45:18
Go to the top of the page
+Quote Post

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: 8.10.2025 - 16:03