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ń.