Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Losowanie cyfry bez kolejnych powtórzeń
Forum PHP.pl > Forum > PHP
lorenzo
Witam,

Muszę losować kilkukrotnie cyfrę 1 z 10, z tym że jedna cyfra po drugiej nie może być taka sama. A liczby muszą być oczywiście losowane z zakresu 1-10.
Znalazłem gotowe rozwiązania typu lotto: losuje się jedna liczbę i ona się już więcej w całym losowaniu nie powtórzy. Nie o to mi chodziło.

Poniżej proponowane rozwiązanie.
Czy (a jeżeli tak, to gdzie) widzicie tu błąd?


  1. function losujcyfre() {
  2.  
  3. $liczby = range(1,10);
  4. $wylosowane = array_rand($liczby,1);
  5. $wylosowane += 1;
  6. if(($wylosowane) == $_SESSION ['wylosowana']) {
  7. losujcyfre();
  8. } else {
  9. $_SESSION ['wylosowana'] = $wylosowane;
  10. }
  11. }


Zapomniałem dodać, że liczba (liczby są losowane) ale zdarza się ze po kilka razy jest losowana ta sama liczba
Sephirus
Z braku laku twoje rozwiązanie może być ale posiada pewien minus - jeśli wylosuje się ta sama liczba to jest kolejne losowanie - może się to okazać mało wydajne dla losowania z małego zakresu liczb.

Proponuję użyć:
  1. $numbers = range(1,10);
  2. if(isset($_SESSION ['wylosowana']))
  3. unset($numbers[$_SESSION['wylosowana']-1]);
  4. $_SESSION['wylosowana'] = $numbers[array_rand($numbers,1)];


wink.gif
radziopoke
A nie lepiej za pomocą funkcji shuffle
  1.  
  2. $liczby = range(1, 10);
  3. shuffle($liczby);
  4. echo $liczby[0];
  5. echo $liczby[1];
  6.  

W taki sposób Mozesz wylądować 2 liczby z zakresu od 1 do 10 bez powtórzeń
lorenzo
Dzięki.

Jest tylko mały problem. Korzystając z drugiego rozwiązania jest prawdopodobieństwo ze będą się powtarzały liczby po shuffle np.:
- shuffle mam dwie liczby które nie będa takie same
- wykonuje się shuffle
- i w tym miejscu może się zdarzyć, że druga liczba z pierwszego shuffle moze być taka sama jak pierwsza z drugiego.

Jak to obejść?

  1. function losujcyfre() {
  2.  
  3. if(!isset($_SESSION['los1'])) {
  4. $liczby = range(1,10);
  5. shuffle($liczby);
  6. $_SESSION ['wylosowana'] = $liczby[0];
  7. } else {
  8. $_SESSION ['wylosowana'] = $liczby[2];
  9. unset($_SESSION['los1']);
  10. }
  11. }


jest sens tworzyć następne if(!isset($_SESSION['los1'])), if(!isset($_SESSION['los2'])), ...
Sephirus
Ale kombinujesz ;P

Mój przykład działa na pewno tak jak Ci to potrzbne - czyli losuje jedną liczbę, inną niż ta, która była ostatnio w sesji.

Z użyciem shuffle musisz dać coś takiego:

  1. if(isset($_SESSION['wylosowana'])) {
  2. $liczby = range(1, 10);
  3. shuffle($liczby);
  4. foreach($liczby AS $l) {
  5. if($l != $_SESSION['wylosowana']) {
  6. $_SESSION['wylosowana'] = $l;
  7. break;
  8. }
  9. }
  10. } else $_SESSION['wylosowana'] = rand(1,10);
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.