Skocz do zawartości

Pseudo Losowanie Raz Na Dzień Na Stronie Www


Subaru

Rekomendowane odpowiedzi

Witam

 

Tak wiem, ten tytuł trochę taki... Jak wymyślę lepszy to poprawię.

Przechodząc do sedna sprawy. Zastanawiałem się nad takim rozwiązaniem, by na stronie WWW było losowanie. Miałoby polegać to na tym, że raz dziennie obowiązuje inny zestaw na przykład liczb. Przypuśćmy przycisk "losuj" i wyświetla 3 liczby, ale w danym dniu, nieważne ile razy się kliknie "losuj", zawsze ten sam zestaw. W następny dzień miałby już się wylosować - i "obowiazywać" - inny zestaw liczb.

Z racji, że na darmowych hostingach nie ma za bardzo dostępu do Cron'a by robił to automatycznie, stąd pytam o metodę ręczną manualną.

Jestem otwarty na różne metody rozwiązania tego oprócz tych typowo od M$u, naturalnie :P

 

Pozdrawiam i życzę miłego dnia.

 

Subaru

Odnośnik do komentarza
Udostępnij na innych stronach

Nie napisałeś w jakim języku, przyjmę że PHP. Na logikę masz 2 rozwiązania.

1. normalnie wykonać 3 x rand(min, max) i zapisać wyniki do bazy lub pliku z datą, skrypt sprawdza liczby na aktualną datę (jak nie ma to generuje i zapisuje) i je zwraca.

2. robisz sobie funkcję hashującą zależną od daty która będzie produkowała 3 liczby - tak Pi razy oko, md5 z daty + jakis stały klucz, bierzesz 3 bajty (lub więcej) ze stałych miejsc, i robisz modulo maksymalna liczba do wylosowania. To oczywiście trzeba by lepiej przemyśleć, żeby nikt nie odkrył algorytmu. :) No i nie jest to losowe :)

Odnośnik do komentarza
Udostępnij na innych stronach

Ah przepraszam, troszkę niejasno napisałem faktycznie. Mając na myśli otwartość rozwiązań miałem na myśli również to, że niekoniecznie PHP, acz tutaj chyba będzie najszybciej(?).

 

Hm~ trzy losowania, okej. Zapisać do pliku nawet bym preferował jeśli się tak da, jeśli się da to dobrze, bo z bazami danych to ja tyle o ile. Mmm zapisać przy tym wynik i datę, aha i wtedy porównywać czy data się zgadza. Jak da się tak to jestem jak najbardziej na tak. Zaraz zacznę grzebać po internecie za odpowiednimi poleceniami.

 

Metoda druga też źle nie brzmi acz chyba dla mnie trochu trudniejsza, więc spróbuję z opcją pierwszą póki co. PHP co prawda raczej więcej umiałem czytać niż pisać, ale podobno nie jest to język niemożliwy do nauczenia się :P

 

Bardzo dziękuję za pomoc, zabieram się za walkę z pustym plikiem heheh~ :3

 

Miłego dnia/nocy/?

 

Subaru

Odnośnik do komentarza
Udostępnij na innych stronach

Ah przepraszam, troszkę niejasno napisałem faktycznie. Mając na myśli otwartość rozwiązań miałem na myśli również to, że niekoniecznie PHP, acz tutaj chyba będzie najszybciej(?).

 

Hm~ trzy losowania, okej. Zapisać do pliku nawet bym preferował jeśli się tak da, jeśli się da to dobrze, bo z bazami danych to ja tyle o ile. Mmm zapisać przy tym wynik i datę, aha i wtedy porównywać czy data się zgadza. Jak da się tak to jestem jak najbardziej na tak. Zaraz zacznę grzebać po internecie za odpowiednimi poleceniami.

 

Metoda druga też źle nie brzmi acz chyba dla mnie trochu trudniejsza, więc spróbuję z opcją pierwszą póki co. PHP co prawda raczej więcej umiałem czytać niż pisać, ale podobno nie jest to język niemożliwy do nauczenia się :P

 

Bardzo dziękuję za pomoc, zabieram się za walkę z pustym plikiem heheh~ :3

 

Miłego dnia/nocy/?

 

Subaru

 

No jeśli masz stronę w PHP to najprościej tak. Najlepiej byłoby w bazie danych bo z plikami musisz jeszcze zadbać o bezpieczeństwo, aby nikt nie mógł odczytać danych bezpośrednio. Najlepiej jak będą poza obrębem DocumentRoot aby nie dało się ich czytać z przeglądarki. Nie zawsze to jest możliwe na hostingu więc jak musi być wewnątrz to zabezpiecz plikiem .htaccess.

 

Prosty przykład:

 

<?php

class Lottery {

	private $path;
	private $file_name_prefix = 'lottery_';
	private $file_name_suffix = '.json';
	private $numbers_count = 3;
	private $number_min = 1;
	private $number_max = 1000;
	
	public function __construct($path) {
		$this->path = $path;
	}

	private function generateNumbers() {
		$numbers = array();
		for ($i = 1; $i <= $this->numbers_count; $i++)
			$numbers[] = rand($this->number_min, $this->number_max);
		sort($numbers);
		return $numbers;
	}

        private function getFileName($date) {
        	return $this->path.$this->file_name_prefix.$date.$this->file_name_suffix;
        }

	private function loadNumbers($date) {
		$filename = $this->getFileName($date);
		if ( !file_exists($filename) )
			return false;
		$numbers = json_decode(file_get_contents($filename));
		if ( $numbers === null )
			return false;
		return $numbers;
	}

	private function saveNumbers($date, $numbers) {
		$filename = $this->getFileName($date);
		$json = json_encode($numbers);
		if ( file_exists($filename) )
			return false;
		return ( file_put_contents($filename, $json) !== false );
	}

	public function getTodayNumbers() {
		$date = date('Y-m-d');
		$numbers = $this->loadNumbers($date);
		if ( $numbers === false ) {
			$new_numbers = $this->generateNumbers();
			$this->saveNumbers($date, $new_numbers);
			$numbers = $this->loadNumbers($date);
		}
		return $numbers;
	}

}

$loteria = new Lottery('./');

print_r($loteria->getTodayNumbers());

Można dodać maskowanie danych aby nie zapisywały się czystym tekstem, zmienić na bazę danych itd. Miłej zabawy. :)

Odnośnik do komentarza
Udostępnij na innych stronach

Akurat w tym przypadku jeśli by odczytywali dane z pliku tekstowego to "pfy", ale fakt lepiej od razu uczyć się dobrych nawyków. :P

Kod wygląda sensownie, zaraz spróbuję to zaaplikować i zobaczymy czy mi wybuchnie coś heh. :P

Bardzo dziękuję za pomoc~

Jakby się coś działo, zedytuję post.

 

EDIT #1

OK, jak do tej pory jest dobrze, mamy surowe trzy liczby, to teraz ładnie to obudować rzeczami i heya.

http://rata-diaat.esy.es/Arcana-Cards/

Tutaj będzie można obserwować co ten Subaru wyczynia. Zalecane okulary ochronne i szklanka napoju Fanta©®.

 

EDIT #2

Okej~ Powoli do przodu, acz "new line" i "switch" mi nie chce ogarnąć.O ile w sprawie "switch" jestem na dobrym tropie i z pomocą Google powoli zmierzam ku prawdzie (wha~?) o tyle sprawa "new line" jest dla mnie zagadką, próbowałem póki co:

 

echo PHP_EOL;
echo "\r\n";
echo chr (10);

Za każdym razem efekt jest "jak na obrazku"

 

Arcana Cards! Array ( [0] => 7 [1] => 15 [2] => 16 )

A winno być:

 

Arcana Cards!
Array ( [0] => 7 [1] => 15 [2] => 16 )
Odnośnik do komentarza
Udostępnij na innych stronach

Szaleństwo w środku tygodnia, tego się nie spodziewałem :D

Pomogło, ślicznie dziękuję~

No to wracam do dłubania ze switchem.

 

P.S. - Dobra sygnaturka, całkowicie się zgadzam.

 

EDIT #1

OK Przyznaję bez bicia, łatwe to to nie jest. Będę próbował dalej, Google są w miarę kooperatywne, nie jakoś idealnie, ale źle nie jest, od słowa do słowa natrafiam na kolejne fragmenty układanki. Mimo to nie zmienia to faktu, że jestem przerażony. W C/C++ takie coś to byłaby kwestia 30-60 minut, na DSa dla mnie bez fałszywej skromności może połowę tego czasu, a "webowo" to jest jak jakaś wojna domowa. :P

Nic nie powstaje bez wysiłku, więc zaciskam ząbki, herbatka na stole i kombinuję dalej.

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
×
×
  • Dodaj nową pozycję...