Program LottoCad w wersji 2.32 to doskonałe narzędzie dla tych co lubią kombinacje z liczbami. To doskonały sposób na spędzanie wolnego czasu i zabawę w długie wieczory tej zimy i jesieni. Przewidywanie zdarzeń losowych i doskonałe zajęcie w tym czasie. Czasem nie jest to zabawa a czasem ma nawet dobre strony w postaci premii za realne wygrane Przeczytaj więcej w artykule na ten temat ...
Więc spróbujemy wyprowadzić (sformatować) w sposób czytelny dane i obliczyć niezbedne statystyki zadanych stref.
Ponieważ w przykładzie poprzednim obliczyliśmy tablicę odstepów z z poziomem trafień równym 6 "$HIT_MIN_LIMIT=6" a chcemy miec ststystyki również dla większych poziomów trafień więc pętlę obliczającą tablicę odstepów obejmiemy pętlą która będzie zmieniać własnie poziom trafień (zmienną $HIT_MIN_LIMIT) w granicach od 6 do 8 trafień:
$HIT_MIN_LIMIT = 6 ; $period = array (); // Tu wstawimy zakres pętli For dla zmiennej $HIT_MIN_LIMIT // aby obliczyć tablice odstępów również dla innych poziomów // minimalnych trafień np 6,7 i 8 For ( $HIT_MIN_LIMIT = 6 ; $HIT_MIN_LIMIT <= 8 ; $HIT_MIN_LIMIT ++) // czyli dla zmiennej $HIT_MIN_LIMIT zmieniającej się od 6 do 8 // zwiększanej "po drodze" o jeden (inkrementacja ++) // oblicz tablice odstępów { //------ Pętla obliczająca tablicę odstępów - początek $zone = 1 ; foreach ( $result as $strname => $arr ) { foreach ( $arr as $nrlos => $hit ) if ( $nrlos > 0 ) { if ( $hit [ "hits" ]>= $HIT_MIN_LIMIT ) { $period [ $nrlos ][ $HIT_MIN_LIMIT ][ $zone ]= 0 ; } else $period [ $nrlos ][ $HIT_MIN_LIMIT ][ $zone ]= $period [ $nrlos - 1 ][ $HIT_MIN_LIMIT ][ $zone ]+ 1 ; } $zone ++; } } //------ Pętla obliczająca tablicę odstępów - koniec
i testujemy wyświetlając zawartość tablicy $period na końcu programu umieszczając polecenie "print_r ($period). Program nieco długo to robi ponieważ wyprowadza prawie 100 tysięcy linii ale czeka nas ciekawostka. Okazuje się że dwie (druga i czwarta) z pięciu stref jeszcze od początku historii losowań nie trafiły pełnych sześciu stref:
[3011] => Array ( [6] => Array ( [1] => 36 [2] => 6 [3] => 14 [4] => 28 [5] => 18 ) [7] => Array ( [1] => 71 [2] => 6 [3] => 19 [4] => 197 [5] => 31 ) [8] => Array ( [1] => 121 [2] => 3011 [3] => 1350 [4] => 3011 [5] => 693 ) ) )
Mamy tablicę odstepów więc możemy formatować wyjście a więc stworzyć czytelny raport uzupełniony o statystyki i histogramy rozkładu trafień.
Na początku zajmiemy się czytelnym wyświetleniem tablicy odstepów. Chcemy ją wyświetlić w postaci :
Trafienia strefy 1 strefy 2 strefy 3 strefy 4 strefy 5 nr_losow 6 7 8 6 7 8 6 7 8 6 7 8 6 7 8 --------- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----
Jak będziemy składać (wybierać z tablicy) poszczególne wiersze raportu więc musimy mieć kolejno do dyspozycji numer losowania, kolejne strefy a w nich kolejne wartości odstepów.Raport również można tak skonstruować aby odstępy gdzie nie było trafień były wyświetlane w postaci pustych pól albo znaku kropki. Wówczas tablica taka jest bardziej czytelna.
Skonstruujemy najpierw (bardzo dobry zwyczaj w programowaniu) sekwencję pętli która odda nam dane w takiej kolejności jak zaprojektowaliśmy składanie poszczególnych elementów wierszy.
foreach ( $period as $nrlos => $period_a ) { // iteruje po kolejnych numetach losowań // w każdym kroku zwraca numer losowania i tablicę odstępów // dla tego numeru losowania foreach ( $period_a as $zone => $period_z ) // iteruje po kolejnych strefach // w każdym kroku zwraca numer strefy i tablicę odstępów // dla tego numeru strefy { foreach ( $period_z as $limit => $value ) // iteruje wartości odstępów dla poszczególnych limitów // w kazdym kroku zwraca wartość limitu i odstęp { } } }
Ale ponieważ zaprojektowaliśmy kolejność wybierania wg porządku : numer losowania, strefa, wartości wg limitu trafień a tablicę mamy zrobioną wg porządku :
$period[$HIT_MIN_LIMIT][$nrlos][$zone]
czyli porządku : limit trafień, numer losowania, strefa więc należy zmodyfikować fragmenty kodu który oblicza tablicę odstepów i tam gdzie kod wykonuje operacje na tablicy zmienić kolejność na :
$period[$nrlos][$zone][$HIT_MIN_LIMIT]
wówczas uzyskamy właściwą kolejność wybierania z tablicy. Więc fragment naszego kodu po modyfikacji wyglądać bedzie:
// ------------------------------------------------------ // zbuduj tablicę odstępów dla wszsytkich stref i losowań // ------------------------------------------------------ $HIT_MIN_LIMIT = 6 ; $period = array (); For ( $HIT_MIN_LIMIT = 6 ; $HIT_MIN_LIMIT <= 8 ; $HIT_MIN_LIMIT ++) // czyli dla zmiennej $HIT_MIN_LIMIT zmieniającej się od 6 do 8 // zwiększanej "po drodze" o jeden (inkrementacja ++) // oblicz tablice odstępów { //------ Pętla obliczająca tablicę odstępów - początek $zone = 1 ; foreach ( $result as $strname => $arr ) { foreach ( $arr as $nrlos => $hit ) if ( $nrlos > 0 ) { if ( $hit [ "hits" ]>= $HIT_MIN_LIMIT ) { $period [ $HIT_MIN_LIMIT ][ $nrlos ][ $zone ]= 0 ; } else $period [ $HIT_MIN_LIMIT ][ $nrlos ][ $zone ]= $period [ $HIT_MIN_LIMIT ][ $nrlos - 1 ][ $zone ]+ 1 ; } $zone ++; } } // Wy ś wietlamy tablicę odstępów w postaci // Trafienia strefy 1 strefy 2 ... strefy 5 // nr_los 6 7 8 6 7 8 6 7 8 // ------ ---- ---- ---- ---- ---- ---- ---- ---- ---- foreach ( $period as $nrlos => $period_a ) { // iteruje po kolejnych numetach losowań // w każdym kroku zwraca numer losowania i tablicę odstępów // dla tego numeru losowania foreach ( $period_a as $zone => $period_z ) // iteruje po kolejnych strefach // w każdym kroku zwraca numer strefy i tablicę odstępów // dla tego numeru strefy { foreach ( $period_z as $limit => $value ) // iteruje wartości odstępów dla poszczególnych limitów // w kazdym kroku zwraca wartość limitu i odstęp { } } }
Teraz mozna wyprowadzać wyniki we własciwej kolejności :
Teraz w pętlach iterujących po tablicy (już bez komentarzy) i w miarę dostępności danych będę składał kolejne wiersze raportu. Aby uzyskać ładne formatowanie tabeli tekstowej użyłem funkcji sprintf. Funkcja ta jest dobrze opisana w pliku pomocy i mozna się z nim zapoznać. Do składania napisów służy operator składania (dodawania) napisów (stringów). Jest to operator kropki.
$napis="ala"." ma"." kota"; kropki między napisami powodują że stringi, napisy są łączone i zmienna $napis, będzie miała wartość "ala ma kota".
a teraz operacja :
$napis=$napis." i dwa psy"; spowoduje że zmienna $ napis będzie miała wartość "ala ma kota i dwa psy".
istnieje operator uproszczony dodawania stringów i ma postać :
$napis.=" i dwa psy";
i efekt jego działania jest dokładnie taki sam jak wyżej ale zapis jest uproszczony.
Dysponując danymi we wnetrzu każdej z pętli można złożyć raport wiersz po wierszu. Pełny zapis skryptu wyświetlającego tablicę odstepów trafień w strefy zamieszczam niżej :
<? // tu wstaw kod PHP $drawtable=delphi_get_draw_arr(); $strefa1 = array ( array ( 1 , 9 ), array ( 2 , 10 ), array ( 3 , 11 ), array ( 4 , 12 ), array ( 5 , 13 ), array ( 6 , 14 ), array ( 7 , 15 ), array ( 8 , 16 )); $strefa2 = array ( array ( 17 , 25 ), array ( 18 , 26 ), array ( 19 , 27 ), array ( 20 , 28 ), array ( 21 , 29 ), array ( 22 , 30 ), array ( 23 , 31 ), array ( 24 , 32 )); $strefa3 = array ( array ( 33 , 41 ), array ( 34 , 42 ), array ( 35 , 43 ), array ( 36 , 44 ), array ( 37 , 45 ), array ( 38 , 46 ), array ( 39 , 47 ), array ( 40 , 48 )); $strefa4 = array ( array ( 49 , 57 ), array ( 50 , 58 ), array ( 51 , 59 ), array ( 52 , 60 ), array ( 53 , 61 ), array ( 54 , 62 ), array ( 55 , 63 ), array ( 56 , 64 )); $strefa5 = array ( array ( 65 , 73 ), array ( 66 , 74 ), array ( 67 , 75 ), array ( 68 , 76 ), array ( 69 , 77 ), array ( 70 , 78 ), array ( 71 , 79 ), array ( 72 , 80 )); $allzone = array ( "strefa1" => $strefa1 , "strefa2" => $strefa2 , "strefa3" => $strefa3 , "strefa4" => $strefa4 , "strefa5" => $strefa5 ); //print_r($allzone); //$backdraw=array_reverse($drawtable); $result = array (); foreach ( $drawtable as $nrlos => $losowanie ) { $data = array_shift ( $losowanie ); // wybiera datę i skraca tablicę $losowanie o datę foreach ( $allzone as $strname => $strefaX ) { $hits = 0 ; $hit1 = 0 ; $hit2 = 0 ; // wyzerowanie liczników foreach ( $strefaX as $strefa ) { $hitzone = array_intersect ( $strefa , $losowanie ); $hita = count ( $hitzone ); // zlicza ilo ś ć trafień if ( $hita == 1 ) $hit1 ++; // zlicza trafienia pojedyńcze w strefę if ( $hita == 2 ) $hit2 ++; // zlicza trafienia podwójne w strefę if ( $hita > 0 ) $hits ++; // zlicza trafione strefy } $result [ $strname ][ $nrlos ][ "hits" ]= $hits ; $result [ $strname ][ $nrlos ][ "hit1" ]= $hit1 ; $result [ $strname ][ $nrlos ][ "hit2" ]= $hit2 ; $result [ $strname ][ $nrlos ][ "date" ]= $data ; } } $lastnrlos = $nrlos ; // ------------------------------------------------------ // zbuduj tablicę odstępów dla wszsytkich stref i losowań // ------------------------------------------------------ $HIT_MIN_LIMIT = 6 ; $period = array (); For ( $HIT_MIN_LIMIT = 6 ; $HIT_MIN_LIMIT <= 8 ; $HIT_MIN_LIMIT ++) // czyli dla zmiennej $HIT_MIN_LIMIT zmieniaj ą cej się od 6 do 8 // zwiększanej "po drodze" o jeden (inkrementacja ++) // oblicz tablice odstępów { //------ Pętla obliczająca tablicę odstępów - pocz ą tek $zone = 1 ; foreach ( $result as $strname => $arr ) { foreach ( $arr as $nrlos => $hit ) if ( $nrlos > 0 ) { if ( $hit [ "hits" ]>= $HIT_MIN_LIMIT ) { $period [ $nrlos ][ $zone ][ $HIT_MIN_LIMIT ]= 0 ; } else $period [ $nrlos ][ $zone ][ $HIT_MIN_LIMIT ]= $period [ $nrlos - 1 ][ $zone ][ $HIT_MIN_LIMIT ]+ 1 ; } $zone ++; } } // Wy ś wietlamy tablicę odstępów w postaci // Trafienia strefy 1 strefy 2 ... strefy 5 // nr_los 6 7 8 6 7 8 6 7 8 // ------ ---- ---- ---- ---- ---- ---- ---- ---- ---- Print "Trafienia strefy 1 strefy 2 strefy 3 strefy 4 strefy 5 nr_los 6 7 8 6 7 8 6 7 8 6 7 8 6 7 8 ------ ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----\\n" ; foreach ( $period as $nrlos => $period_a ) { // iteruje po kolejnych numetach losowań // w każdym kroku zwraca numer losowania i tablicę odstępów // dla tego numeru losowania $row = sprintf ( "%6d " , $nrlos ); // polecenie spritf(format,argument formatowany) // wypisuje numer losowania jako liczbę całkowit ą // na 6 pozycjach dosunięt ą do prawej oraz trzy spacje odstępu foreach ( $period_a as $zone => $period_z ) // iteruje po kolejnych strefach // w każdym kroku zwraca numer strefy i tablicę odstępów // dla tego numeru strefy { foreach ( $period_z as $limit => $value ) // iteruje wartości odstępów dla poszczególnych limitów // w kazdym kroku zwraca warto ś ć limitu i odstęp { if (( $nrlos == 1 ) or ( $lastnrlos == $nrlos )) // jeżeli jest to pierwsze lub ostatnie losowanie // wy ś wietlaj warto ś ć bież ą cego odstępu { $row .= sprintf ( "%4d " , $value ); continue ; } if ( $value == 0 ) // jeżeli wyst ą piło trafienie w strefę to drukowany $row .= sprintf ( "%4d " , $period [ $nrlos - 1 ][ $zone ][ $limit ]); // wyświetlaj odstęp z poprzedniego losowania else // w przeciwnym przypadku nie ma trafienia // i wyświetlaj znak kropki $row .= " . " ; } $row .= " " ; // dodaj 4 spacje między grupami } print " $row \\n" ; // wyprowadż - drukuj nastepny wiersz } ?>
W następnej lekcji dodamy trochę statystyk zbiorczych i histogramy (czyli jaki jest rozkład najczęstszych odstepów) trafień.