Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Losowanie cyfry co 24h
Forum PHP.pl > Forum > Przedszkole
mateŁusz
A więc mam taki kod:
  1. <?php
  2. $numerek=''; for($i='0';$i<1;$i++){$numerek.=rand(1,38);}
  3. echo $numerek
  4. ?>


Co zrobić, aby cyfra z zakresu 1 - 38 losowała się co 24h? Jak będzie godzina 0.00 to liczba zmienia się sama.
Tak samo.. jak zrobić, aby było, np. że cyfra 14 i 17 ma 30% na wylosowanie się? smile.gif
erix
cron i zapisuj sobie wynik w pliku.
sowiq
Rozumiem, że poza wylosowaniem, coś z tym numerem dalej robisz - np. zapisujesz w bazie. Bo inaczej to chyba nie ma sensu go losować i zostawiać w pamięci RAM snitch.gif

Masz dwa wyjścia:
1. CRON odpalany co 24 godziny
2. Za każdym razem przy odpaleniu skryptu sprawdzać, czy danego dnia została już wylosowana liczba. Jeśli nie, to najpierw ją losujesz. Jeśli tak, to po prostu odczytujesz.

Co do drugiej części pytania:
  1. rand(1, 100) <= 25 // warunek zwróci TRUE dla ~25% przypadków
mateŁusz
Zastosowanie skryptu jest takie:

- Szczęśliwy numerek w szkole. Jaki numerek wylosuje to osoba z tym numerkiem nie będzie, np. pytana.

CRON - nie mam pojęcia jak to zrobić, ogólnie z pisania skryptów jestem dość słaby.

Serwer na którym stoi strona szkoły nie ma bazy danych.

Propo
  1. rand(1,100) <= 25


25% szans wychodzi tylko dla liczby 1, a jak zrobić, aby było dla liczby 11, a w tym, aby losowało ten zakres 1-38.
kyku
to zapisuj do pliku
  1. odczyt:
  2.  
  3. echo 'Liczba to: '.file_get_contents('liczba.txt');
  4.  
  5. a tak zapis:
  6.  
  7. file_put_contents('liczba.txt', rand(0,100));
  8.  


Cytat
25% szans wychodzi tylko dla liczby 1, a jak zrobić, aby było dla liczby 11, a w tym, aby losowało ten zakres 1-38.

a czy szansa na wylosowanie 1, 11 czy 99999 jest rozna?...

38 * 25% = 9.5
czyli
  1. if(rand(1,38)<=9.5){
mateŁusz
No dobra, teraz kwestia zrobić tak, aby cyfra zmieniała się co 24h.. nerdsmiley.png
kyku
cronem:

crontab -e

i dopisujesz

* 0 * * * php /sciezka/do/skryptu.php >/dev/null 2>&1
mateŁusz
Dobra, i tak nie rozumiem nic z tego co piszesz.
Wolę już zlecić komuś, zapłacić i wiedzieć, że będzie działać niż się wkurwiać.
b4rt3kk
Moim zdaniem liczba nie musi losować się automatycznie, bo wystarczyłoby, że jak ktoś wejdzie na stronkę to w tym momencie dopiero sprawdza czy liczba nie jest ta sama dłużej niż 24h i wtedy losuje nową. Jako godzinę wyjściową ustalić np. 00:00.

Data ustalenia pierwszej liczby: 2012-10-01 00:00:00, z datą ważności do 2012-10-01 23:59:59, kolejna byłaby od 2012-10-02 00:00:00, itd. Jeśli przez dzień lub dwa nikt by na stronkę nie wchodził to oczywistym jest, że nie wygenerowałoby kolejnej liczby, ale raczej ludzie bezpośrednio w bazie danych tego sprawdzać nie będą? Ogólnie rzecz biorąc wystarczy ustalić datę ważności nowej liczby na dzień dzisiejszy, do godz 23:59:59, jeśli data ważności poprzedniej już wygasła.

Myślę, że to dosyć prosta metoda.

A co do większej szansy na wylosowanie danej liczby to dodaj wagi liczb, ale wtedy mt_rand się nie sprawdzi, będziesz potrzebował tabeli z liczbami i ich wagami.

  1. $ile = 24 // ile numerków do losowania
  2. $liczba = 10 // który numerek ma mieć większą wagę
  3. $szansa = 0.3 // o ile % większa szansa na wylosowanie
  4. $waga = ceil($ile*$szansa) // waga, może być liczona lub wpisana ręcznie
  5. $tablica = array();
  6.  
  7. for ($i=1; $i<=$ile; $i++) {
  8. if ($i == $liczba) for ($j=1; $j<=$waga; $j++) $tablica[] = $i; else $tablica[] = $i;
  9. }
  10.  
  11. $numer_wylosowany = $tablica[mt_rand(1, sizeof($tablica))];


takie coś mi do głowy przyszło w związku z losowaniem jednej liczby ze zwiększoną szansą.
kyku
szkoda kasy na cos takiego, trzymaj
  1. <?php
  2.  
  3. $plik = file_get_contents('liczba.txt');
  4. $temp = explode('|', $plik);
  5. if (date('j') == $temp[1]) { // data sie zgadza
  6. $nr = $temp[0];
  7. echo 'Dzisiejszy numerek to: ' . $nr;
  8. } else { // losowanie nowego numerka
  9. $nr = rand(1, 38);
  10. file_put_contents('liczba.txt', $nr . '|' . date('j'));
  11. }
  12.  
  13. ?>
mateŁusz
O stary, dzięki wielkie.
Wrzucę to na serwer, aby zobaczyć czy się po godzinie 23.59 zmieni cyfra smile.gif

Jakby coś nie działało to napiszę tutaj, jeszcze raz wielkie dzięki smile.gif
csharp
no tak ... ale musisz w takim razie uruchamiać go za każdym razem... samo się zmieniać nie będzie.
kyku
wystarczy wejść na stronę jeżeli wszystko jest w indexie (a chyba jest)
Julcio
Cytat(kyku @ 1.10.2012, 16:27:22 ) *
szkoda kasy na cos takiego, trzymaj
  1. <?php
  2.  
  3. $plik = file_get_contents('liczba.txt');
  4. $temp = explode('|', $plik);
  5. if (date('j') == $temp[1]) { // data sie zgadza
  6. $nr = $temp[0];
  7. echo 'Dzisiejszy numerek to: ' . $nr;
  8. } else { // losowanie nowego numerka
  9. $nr = rand(1, 38);
  10. file_put_contents('liczba.txt', $nr . '|' . date('j'));
  11. }
  12.  
  13. ?>


Mógłby mi ktoś przerobić ten skrypt, żeby losował 3 liczby z 15?
mlawnik
  1. <?php
  2.  
  3. $plik = file_get_contents('liczba.txt');
  4. $temp = explode('|', $plik);
  5. if (date('j') == $temp[1]) { // data sie zgadza
  6. //tu foreach dla 3 numerków
  7. $nr = $temp[0];
  8. echo 'Dzisiejsze numerki to: ' . $nr;
  9. } else { // losowanie nowego numerka
  10. //a ten kod dajesz we while i powtarzasz 3 razy
  11. $nr = rand(1, 38);
  12. file_put_contents('liczba.txt', $nr . '|' . date('j'));
  13. }
  14.  
  15. ?>
Julcio
Cytat(mlawnik @ 12.08.2013, 23:56:53 ) *
  1. <?php
  2.  
  3. $plik = file_get_contents('liczba.txt');
  4. $temp = explode('|', $plik);
  5. if (date('j') == $temp[1]) { // data sie zgadza
  6. //tu foreach dla 3 numerków
  7. $nr = $temp[0];
  8. echo 'Dzisiejsze numerki to: ' . $nr;
  9. } else { // losowanie nowego numerka
  10. //a ten kod dajesz we while i powtarzasz 3 razy
  11. $nr = rand(1, 38);
  12. file_put_contents('liczba.txt', $nr . '|' . date('j'));
  13. }
  14.  
  15. ?>

Niestety liczyłem na tzw. gotowca, wiem, jestem leniem patentowanym, ale nigdy nie zagłębiałem się w PHP, ponieważ nie jest mi aż tak bardzo potrzebne, tylko od czasu do czasu potrzebuję mniejsze skrypty, licząc na gotowce, więc jeśli ktoś byłby chętny zmienić mi ten kod na "gotowo", to bardzo bym prosił.
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.