Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Skrypt do losowania szczęśliwych numerków
Forum PHP.pl > Forum > PHP
irzyk09
Witam mam następujacy skrypt:

  1. <?php
  2. $dzien=date('D');
  3.  
  4. if($dzien=="Sat" || $dzien=="Sun") {
  5. echo 'Dzisiaj nie są losowane szczęśliwe numerki.';
  6. exit; }
  7.  
  8. else {
  9. echo 'Dzisiejsze szczęśliwe numerki to: <b><font color="red">';
  10. if(file_exists('/wp-content/themes/szkola/numerek/numerek.txt')) {
  11. $liczby=file('/wp-content/themes/szkola/numerek/numerek.txt');
  12. if ($liczby[2]==$dzien) {
  13. echo intval($liczby[0]).', '.intval($liczby[1]); } }
  14. if($liczby[2]!=$dzien) {
  15. $liczba1=rand(1,30);
  16. $liczba2=rand(1,30);
  17. while($liczba2==$liczba1) {
  18. $liczba2=rand(1,30); }
  19. $plik=fopen('/wp-content/themes/szkola/numerek/numerek.txt', 'w');
  20. fwrite($plik, "$liczba1 - Pierwsza liczba
  21. $liczba2 - Druga liczba
  22. $dzien");
  23. fclose($plik);
  24. echo $liczba1.', '.$liczba2;}}
  25. ?>


Chciałbym aby liczby wylosowane z pewnego zakresu np 1-30 zapisywały się i żeby nie możliwa była sytuacja, że liczba się będzie powtarzać. Chodzi o to aby wszystkie liczby z podanego zakresu się pojawiły czyli jeżeli wyświetli się już 29 liczb w ciągu 29 dni to kolejnego dnia musi wylosować się 30. Chodzi o to żeby każdy miał równe szanse na wylosowanie i aby to każdego spotykało. Pozdrawiam i proszę o poradę.
SmokAnalog
Są dwa popularne rozwiązania problemu losowych liczb bez powtórzeń:
  1. Pętla while, która działa tak długo, aż nie zostanie wylosowana liczba,a która jeszcze nie padła.
    Nie lubię tego rozwiązania. Jest mało eleganckie i teoretycznie (praktycznie nie) może zawiesić skrypt w nieskończoność.
  2. Działanie na puli dostępnych liczb
    To rozwiązanie jest o wiele lepsze. Masz tablicę z liczbami dostępnymi do wylosowania, na przykład od 1 do 30. Losujesz liczbę, na przykład 7 i w tym momencie wyrzucasz liczbę z tablicy. Teraz masz w tablicy 29 liczb i losujesz jedną z nich - szansy na powtórzenie nie ma, bo... liczby 7 nie ma już w puli.
KR2615
Albo na MySQLu:
Każdej liczbie dodać polę last DATETIME gdzie będzie zapisywane kiedy ostatnio padła. Potem wybierać
  1. SELECT * FROM numbers ORDER BY last ASC LIMIT 10
i z tych dziesięciu losować dwie. Imo daje to większą losowość niż wywalanie z tablicy.
SmokAnalog
Cytat(KR2615 @ 25.02.2014, 10:01:39 ) *
Imo daje to większą losowość niż wywalanie z tablicy.

facepalmxd.gif
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.