Cykliczność występowania liczb w kolejnych losowaniach jest podstawą działania predykcji w module "Prognozy" programu "LottoCAD". Do obejrzenia na YouTube...
Ale w module "Prognozy" okresy cykli są o stałej szerokości a sposób wybierania polega na podziale częstosci w zadany stosunek procentowy liczb pobieranych z histogramów czestosci (czyli podział na liczby "zimne" - rzadziej wystepujace i liczby "gorące" czesciej wystepujace naprzemian w kolejnych okresach o stałej szerokości (ilości losowań).
Wyniki gry z zastosowaniem "prognoz" są zachęcajace i okresowo mozna liczyc na dobre prognozowane wyniki. Dlatego spróbowałem napisać skrypt który szuka podobnych zaleznosci ale nieco inaczej.// wirtualny układ matrycy parametrów (wiersze kolumny): // [4, 6 ,8] // [1, 1 ,1] // [0, 1 ,2] // Przykład parametrów w kodzie PHP odpowiada powyższej matrycy: $back_range = array(4,6,8); // przedziały wstecz (w trzech cyklach po 4,6,8 = 18 losowań) $back_level = array(1,1,1); // poziom trafień w histogramie z każdego przedziału $back_mode = array(0,1,2); // kryteria -2:mniejszy, -1:mniejszy lub równy, 0:równy, 1:większy lub równy, 2:wiekszy
- Okresy i zawartość okresów zadajemy parametrami. Zawartymi w tablicy prostokatnej (matrycy) np: jak powyżej
- Parametry to matryca o ilosci wierszy = 3 elementy, natomiast kolumny to parametry dla poszczególnych okresów analizy
- Kolejne okresy są badane a liczby spełniające kryteria są wybierane a ich wspólne elementy przechodzą selekcję (są wybierane jako prognoza, ponieważ spełniają kryteria)
- Ponieważ cięzko jest z góry okreslić zestaw parametrów dlatego stworzyłem drugi skrypt "symulator" który losowo wybiera zestaw parametrów, szereguje je w tablicy wg skutecznosci trafień (ranking=0 jezeli żadna liczba nie trafiła lub ranking=1 /100%/ jeżeli wszystkie liczby trafiły w następnym losowaniu) od danego offsetu (przesuniecia od odtatniego losowania). Ostatnie losowanie ma offset= 0 /zero/.
Skrypt paskuda
<php error_reporting(5); require_once("include/class_Utils.php"); /* Skrypt wybiera liczby które w zadanych przedziałach spełniają kryteria podane w ustawieniach zmiennych, dla offsetów większych niż jeden skrypt podaje trafienia wybranych liczb. Należy tak dobrać kryteria aby uzyskać najwięcej trafień. Ilść zakresów i kryterium jest dowolna ale ilść kryterium powinna być równa ilości zakresów. Należy o tym pamiętać ( float $arg ); Kryteria oznaczaj1 : $back_range = array(4,6,8); // przedziały wstecz (pierwszy ostatnie losowanie) $back_level = array(1,1,1); // poziom trafień w przedziałach $back_mode = array(0,1,2); // -2:mniejszy, -1:mniejszy lub równy, 0:równy, 1:większy lub równy, 2:wiekszy wybierz liczby które w 4 ostatnich losowaniach trafione były dokładnie jeden raz a w następnych 6 losowaniach trafione były więcej niż 1 raz */ //-------------------------------------- ustawienie zmiennych--------------------------------------- $offsetstart=0; $offsetstop=200; //[ 14, 7, ] //[ 1, 3, ] //[ 1, 1, ] $back_range = array(14,7); // przedziały wstecz (pierwszy element od ostatniego losowania) $back_level = array(1,3); // poziom trafień w przedziałach $back_mode = array(1,1); // liczba oznacza -2:mniejszy, -1:mniejszy lub równy, 0:równy, 1:większy lub równy, 2:wiekszy // ------------------------------------------------------------------------------------------------- $back_array=array($back_range,$back_level,$back_mode); $offset = 0; // ostatnie losowanie w bazie $cutting = $offsetstop+array_sum($back_range)+100; $drawtable= delphi_get_draw_arr(); Utils::draw_to_set_array($drawtable); $drawtable = array_reverse($drawtable); $drawtable = array_splice($drawtable,0,$cutting); $out=array(); for ($offset=$offsetstart;$offset<=$offsetstop;$offset++) { // dla każdego offsetu //echo "offset $offset\n"; $rank=get_paskuda($drawtable,$offset,$back_array); // wybiera paskudę if ($offset>0) { // jeżeli offset>0 sprawdza trafienia tej paskudy $lastdraw=$offset-1; $xhit=array_intersect ( $rank,$drawtable[$lastdraw]); $countXHit = count($xhit); $rankcount = count($rank); //echo sprintf("cnt.rank : %3d, cnt.hit: %3d\n",$rankcount,$countXHit); if ($countXHit>0) { $ranking = $countXHit/$rankcount; $out[]=array("offset"=>$offset, "rank"=>$ranking,$back_array,"psk"=>$rank,"hit"=>$xhit); } else continue; } } // for foreach ($out as $arr) { echo sprintf ("offset: %3d ranking: %1.2f\n%s%s",$arr['offset'],$arr['rank'],array2line("paskuda:",$arr['psk']),array2line(" hit:",$arr['hit'])); echo params2matrix($arr[0]); } // for ($offset=$offsetstart;$offset<=$offsetstop;$offset++) { // dla każdego offsetu // $rank=get_paskuda($drawtable,$offset,$back_array); // wybiera paskudę // print array2line("paskuda : ",$rank); // if ($offset>0) { // jeżeli offset>0 sprawdza trafienia tej paskudy // $lastdraw=$offset-1; // $xhit=array_intersect ( $rank,$drawtable[$lastdraw]); // echo array2line("trafila : ",$xhit); // wypisuje trafienia // } // print " ----------- offset $offset ------\n"; // } function array2line($title,$arr) { $s=""; foreach($arr as $item) $s.=sprintf("%2d ",$item); $s=trim($s); return sprintf("%s (%3d): %s\n",$title, count($arr),$s); } function params2matrix($arr) { $s=""; foreach($arr as $line) { $s.="[ "; foreach($line as $par) { $s.=sprintf("%2d, ",$par); } $s.=" ]\n"; } return $s; } function get_paskuda($draw,$offset,$back_array) { // procedura paskuda // ostatnie losowanie danego offsetu $zx=array(); $lastdraw=$offset; // delkaracja tablicy zx foreach($back_array[0] as $brkey=>$br) { // dla kazdej tróki parametru $back_range $blevel=$back_array[1][$brkey]; $bmode=$back_array[2][$brkey]; $x=array(); $z=array(); // tablice pomocnicze // oblicza kolejne grupy wg kryterii for ($i=0;$i<$br ;$i++) { // robi harmonogram liczb w zakresach z parametrami foreach($draw[$lastdraw] as $num) if (isset($z[$num])) $z[$num]++; else $z[$num]=1; $lastdraw++; // zwiększ licznik o jeden }; foreach($z as $nkey=>$num) { if ($bmode==-2) { //echo $num." < ".$blevel."\n"; // dodaje liczby do tablicy $x jeżeli : if ($num<$blevel) $x[]=$nkey; // jeżeli mode==-2 (trafienia mniejsze niż $blevel) } elseif ($bmode==-1) { if ($num<=$blevel) $x[]=$nkey; // jak wyżej ale trafienia mniejsze } elseif ($bmode==0) { if ($num==$blevel) $x[]=$nkey; // jak wyżej ale trafienia równe } elseif ($bmode==1) { //echo $num." >= ".$blevel."\n"; if ($num>=$blevel) $x[]=$nkey; // jak wyżej ale trafienia większe } elseif ($bmode==2) { if ($num>$blevel) $x[]=$nkey; // jak wyżej ale trafienia większe lub równe }; } $zx[$brkey]=$x; // tablicę $x ładuje do odpowiedniej tablicy zakresu $zx }; $out=$zx[0]; // bierze tablicę pierwszego zakresu foreach($zx as $key=>$arr) if ($key>0) $out=array_intersect ( $out, $arr); // i wybiera wspólne liczby z wszystkich zakresów return $out; // zwraca te liczby jako paskudę. }
Skrypt paskuda, symulator
<php error_reporting(5); require_once("include/class_Utils.php"); /* Znaleziona paskuda z parametrami jak powyżej. Prognoza znalazła 18 liczb z czego w następnym losowaniu zostało trafione 7 liczb co stanowi skuteczność 18%. Po znalezieniu tych parametrów wpisujemy je do skryptu paskuda i robimy analizę dla np 100 offsetów. Obserwując wyniki patrzymy na obliczona skuteczność (ranking) stwierdzany jak często uzyskujemy dobry wynik. Parametry kolejnych okresów losowań są w kolumnach matrycy: offset: 16 ranking: 0.39 paskuda: paskuda: ( 18): 43 34 42 22 46 32 18 58 53 75 4 13 11 9 16 63 35 40 hit: hit: ( 7): 34 58 53 75 13 16 35 [ 14, 7, ] [ 1, 3, ] [ 1, 1, ] Jak to jest budowane? Skrypt pobiera pierwszą kolumnę (pack=0) i buduje w okresie back=14 losowań histogram częstości wystąpień liczb. Dla mode=1 i level=1 Wybiera z histogramu częstości te liczby które wystąpiły w tych 14 losowaniach (back=14) wiecej lub równo (mode=1) jeden raz (level=1). Więc są to wszystkie liczby z tego zakresu. W histogramie widać częstość a tablica jest posortowana wg częstości właśnie. Przykład: liczba 65 w 14 losowaniach wystąpiła 7 razy, liczba 60 pieć razy a liczba 77 trzy razy. ########################## back=14 level=1 mode=1 --- pack : 0 --- --- histo : 7 6 6 6 6 6 6 6 6 6 5 5 5 5 5 5 5 5 5 5 5 5 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 --- liczby:65 45 16 35 30 70 11 20 27 79 60 2 17 56 41 6 42 40 69 51 49 78 75 73 55 5 12 24 1 26 7 64 37 38 39 48 80 33 72 77 21 57 9 15 25 50 61 47 10 14 29 53 59 58 13 44 68 8 31 52 32 28 46 18 62 19 74 4 54 23 36 76 71 34 43 63 66 22 67 To samo robi z paczką drugą (druga kolumna parametrów) back=7 level=3 mode=1 Jak widać ma za zadanie z paczki następnych back=7 losowań, zrobic histogram częstości i wybrać z niego liczby które wystąpiły (więcej lub równo (mode=1) 3 krotnie (level=3)). Poniżej to liczby z linii (---output) --- output :65 45 16 35 30 70 11 20 27 79 60 2 17 56 41 6 42 40 69 51 49 78 75 73 55 5 12 24 1 26 7 64 37 38 39 48 80 33 72 77 21 57 9 15 25 50 61 47 10 14 29 53 59 58 13 44 68 8 31 52 32 28 46 18 62 19 74 4 54 23 36 76 71 34 43 63 66 22 67 --- select :43 34 42 22 46 32 18 58 53 75 4 13 11 9 16 63 35 40 --- output :43 34 42 22 46 32 18 58 53 75 4 13 11 9 16 63 35 40 teraz paczkę z pierwszej kolumny (---output) porównuje z paczką z drugiej kolumny (---output) robi logiczną operację I (AND) na zbiorach liczb i pobiera jako paskudę (---output) zestaw wspólny (liczb występujących w obu zbiorach) Paczkę tę sprawdza z losowaniem następnym od losowania offset (następne losowanie) */ //-------------------------------------- ustawienie zmiennych--------------------------------------- $offsetstart=0; // od offsetu zero ostatnie losowanie $offsetstop=20; // ilosc sprawdzanych offsetow $ranges["back_range"]= array(1,20); // zakres paczek losowan (okresy) $ranges["back_level"]=array(0,10); // ilosc trafien w zakresie od zero do 10 $ranges["back_mode"]=array(-2,2); // zakresy od -2 do 2 oznaczaja rodzaj porownania "<, <=, =, >=, >" $ranges["count"] = 2; // ilosc okresow glownych $iterations = 100; // ilosc losowan kombinacji parametr??//------------------------------------------------------------------------------------------------------- $cutting = ($offsetstop-$offsetstart)+($ranges["count"]*$ranges["back_range"][1])+100; $drawtable= delphi_get_draw_arr(); Utils::draw_to_set_array($drawtable); $drawtable = array_reverse($drawtable); $drawtable = array_splice($drawtable,0,$cutting); // $back_range = array(4,6,8); // przedzia3y wstecz (pierwszy element od ostatniego losowania) // $back_level = array(1,1,1); // poziom trafien w przedzia3ach // $back_mode = array(1,1,1); // liczba oznacza -2:mniejszy; -1:mniejszy lub rowny 0:równy 1:wiekszy lub równy 2:wiekszy // Pętla główna // ------------------------------------------------------------------------------------------------- $items=array(); For ($i=$ranges["back_range"][0];$i<=$ranges["back_range"][1];$i++) { For ($j=$ranges["back_level"][0];$j<=$ranges["back_level"][1];$j++) { For ($k=$ranges["back_mode"][0];$k<=$ranges["back_mode"][1];$k++) { $items[]=array($i,$j,$k); } } } $cnt = count($items); $out=array(); do { $back_range = array(); $back_level = array(); $back_mode = array(); for ($i=0;$i<$ranges["count"];$i++) { // dla każdej kolumny (okresu) $rnd = rand(0,$cnt); //echo "rand: $rnd, i: $i, cnt: $cnt\n"; $back_range[] = $items[$rnd-1][0]; $back_level[] = $items[$rnd-1][1]; $back_mode[] = $items[$rnd-1][2]; } $back_array=array($back_range,$back_level,$back_mode); //echo params2line($back_array); $offset = 0; // ostatnie losowanie w bazie for ($offset=$offsetstart;$offset<=$offsetstop;$offset++) { // dla każdego offsetu //echo "offset $offset\n"; $rank=get_paskuda($drawtable,$offset,$back_array); // wybiera paskudę if ($offset>0) { // jeżeli offset>0 sprawdza trafienia tej paskudy $lastdraw=$offset-1; $xhit=array_intersect ( $rank,$drawtable[$lastdraw]); $countXHit = count($xhit); $rankcount = count($rank); //echo sprintf("cnt.rank : %3d, cnt.hit: %3d\n",$rankcount,$countXHit); if ($countXHit>0) { $ranking = $countXHit/$rankcount; $out[]=array("offset"=>$offset, "rank"=>$ranking,$back_array,"psk"=>$rank,"hit"=>$xhit); } else continue; } } // for $iterations--; //echo "iteracja $iterations\n"; } while ($iterations>0); usort($out,"cmp"); foreach ($out as $arr) { echo sprintf ("offset: %3d ranking: %1.2f %s %s\n",$arr['offset'],$arr['rank'],array2line("paskuda:",$arr['psk']),array2line("hit:",$arr['hit'])); echo params2matrix($arr[0]); } //echo "rank: {$out["ranking"]}"; //echo ", params:" // Koniec programu zasadniczego // funkcje pomocnicze function params2line($arr) { $s=sprintf("[%2d %2d %2d], [%2d %2d %2d], [%2d %2d %2d]\n",$arr[0][0],$arr[0][1],$arr[0][2],$arr[1][0],$arr[1][1],$arr[1][2],$arr[2][0],$arr[2][1],$arr[2][2]); return $s; } function params2matrix($arr) { $s=""; foreach($arr as $line) { $s.="[ "; foreach($line as $par) { $s.=sprintf("%2d, ",$par); } $s.=" ]\n"; } return $s; } function array2line($title,$arr) { $s=""; foreach($arr as $item) $s.=sprintf("%2d ",$item); $s=trim($s); return sprintf("%s (%3d): %s",$title, count($arr),$s); } function get_paskuda($draw,$offset,$back_array) { // procedura paskuda // ostatnie losowanie danego offsetu $zx=array(); $lastdraw=$offset; // delkaracja tablicy zx foreach($back_array[0] as $brkey=>$br) { // dla kazdej tróki parametru $back_range $blevel=$back_array[1][$brkey]; $bmode=$back_array[2][$brkey]; //echo "########################## back=$br level=$blevel mode=$bmode\n"; $x=array(); $z=array(); // tablice pomocnicze // oblicza kolejne grupy wg kryterii for ($i=0;$i<$br ;$i++) { // robi harmonogram liczb w zakresach z parametrami foreach($draw[$lastdraw] as $num) $z[$num]++; $lastdraw++; // zwiększ licznik o jeden }; arsort($z); //echo "--- pack : $brkey ---\n"; //echo "--- histo :",Utils::printTicket($z),"\n"; //echo "--- liczby:",Utils::printTicket(array_keys($z)),"\n"; foreach($z as $nkey=>$num) { if ($bmode==-2) { // dodaje liczby do tablicy $x jeżeli : if ($num<$blevel) $x[]=$nkey; // jeżeli mode==-2 (trafienia mniejsze niż $blevel) } elseif ($bmode==-1) { if ($num<=$blevel) $x[]=$nkey; // jak wyżej ale trafienia mniejsze } elseif ($bmode==0) { if ($num==$blevel) $x[]=$nkey; // jak wyżej ale trafienia równe } elseif ($bmode==1) { if ($num>=$blevel) $x[]=$nkey; // jak wyżej ale trafienia większe } elseif ($bmode==2) { if ($num>$blevel) $x[]=$nkey; // jak wyżej ale trafienia większe lub równe }; } $zx[$brkey]=$x; // tablicę $x ładuje do odpowiedniej tablicy zakresu $zx }; $out=$zx[0]; // bierze tablicę pierwszego zakresu //echo "offset: $offset -------------------\n"; //echo "lastdraw: $lastdraw ---------------\n"; //echo params2matrix($back_array); foreach($zx as $key=>$arr) { // echo "--- output :",Utils::printTicket($out),"\n"; if ($key>0) $out=array_intersect ( $arr,$out); // i wybiera wspólne liczby z wszystkich zakresów // echo "--- select :",Utils::printTicket($arr),"\n"; // echo "--- output :",Utils::printTicket($out),"\n"; } return $out; // zwraca te liczby jako paskudę. } function cmp($a, $b) { if ($a["rank"] == $b["rank"]) { return 0; } return ($a["rank"] < $b["rank"]) ? 1 : -1; }
Brak komentarzy:
Prześlij komentarz