Wszystkie kombinacje Lotto

Zastanawiałeś się kiedyś jak programem komputerowym wygenerować w pliku wszystkie kombinacje w Dużego Lotka?. Myślałeś, że do tego potrzebnych będzie setki lub więcej wierszy kodu? Sprawa jest dużo prostsza niż myślisz!
Należy najpierw zastanowić się jak chcielibyśmy to rozwiązać. Pierwsze co nasuwa się na myśl to jaka będzie pierwsza i ostatnia kombinacja. Pierwszą będzie: 1,2,3,4,5,6 a ostatnią 44,45,46,47,48,49. To daje nam punkt wyjścia do określenia algorytmu rozwiązania. Kolejne kombinacje:

1,2,3,4,5,7
1,2,3,4,5,8

.

.

.

1,2,3,4,5,49. W tym momencie przedostatnią liczbę zwiększamy o 1 i narzucamy warunek, że ostatnia musi być na początku o 1 większa od przedostatniej:

1,2,3,4,6,7
1,2,3,4,6,8

1,2,3,4,6,49. I znowu powiększamy o 1:

1,2,3,4,7,8

1,2,3,4,7,49

Przypuśćmy, że jesteśmy gdzieś w środku:

10,11,12,47,48,49. Nie możemy już w żaden sposób zmienić 3 ostatnich liczb. Zwiększamy trzecią od lewej o 1:
10,11,13,47,48,49. W pętli z kolei musi być narzucony warunek, że trzecia od lewej musi być co najwyżej równa trzeciej od prawej pomniejszonej o 1, czyli:
10,11,46,47,48,49 Itd, itd.

Zostań Profesjonalistą W Tworzeniu Aplikacji Webowych! Zapisz Się Na Kurs Laravel nauczysz się również tworzyć aplikacje hybrydowe na smartfony

Powyższy tok myślenia zastosowany jest w poniższym skrypcie. Składa się on z pięciu zagnieżdżonych pętli do...while();. Być może nie jest to jedyne i najlepsze rozwiązanie tego problemu.

<?php
/**
 *  Generowanie wszystkich kombinacji 6 liczb z 49
 * 
 *  @author     NetProgs.pl <www.netprogs.pl>
 *  @copyright  (c) 2014 NetProgs.pl
 *  @license  Distributed under the MIT License.
 */
$tabela = array('liczba1' => '', 'liczba2' => '', 'liczba3' => '', 'liczba4' => '', 'liczba5' => '', 'liczba6' => '');
$a = 1;
$b = 2;
$c = 3;
$d = 4;
$e = 5;
$f = 49;

$p = fopen('kombinacje6-49.txt', 'a');

do {
    do {
        do {
            do {
                do {
                    $tabela['liczba1'] = $a;
                    $tabela['liczba2'] = $b;
                    $tabela['liczba3'] = $c;
                    $tabela['liczba4'] = $d;
                    $tabela['liczba5'] = $e;

                    for ($v = $e + 1; $v <= $f; $v++)
                    {
                        $tabela['liczba6'] = $v;
                        $plik = implode(',', $tabela);
                        fwrite($p, $plik . "\n");
                    }
                    $e++;
                } while ($tabela['liczba5'] !== 48);

                $d++;
                $e = $d + 1;
            } while ($tabela['liczba4'] !== 47);

            $c++;
            $d = $c + 1;
            $e = $d + 1;
        } while ($tabela['liczba3'] !== 46);

        $b++;
        $c = $b + 1;
        $d = $c + 1;
        $e = $d + 1;
    } while ($tabela['liczba2'] !== 45);

    $a++;
    $b = $a + 1;
    $c = $b + 1;
    $d = $c + 1;
    $e = $d + 1;
} while ($tabela['liczba1'] !== 44);

fclose($p);
?>

Skrypt na przeciętnym komputerze wykonuje się prawie 10 min. Serwer, na którym wykonasz skrypt może mieć ustawiony maksymalny czas egzekucji skryptu php na mniejszy niż wymagany. Wówczas będziesz musiał go podwyższyć.

Nie polecane jest otwierać pliku windowsowym notatnikiem! (bo może się nie otworzyć), Polecany jest Notepad++. Plik waży ponad 200 MB.

O poprawności rozwiązania możemy przekonać się otwierając wygenerowany plik.

Pierwsze trzy szóstki:

Ostatnie trzy szóstki:

Widzimy, że ostatni zapisany numer wiersza to 13983816. Dokładnie tyle jest kombinacji 6 liczb ze zbioru 49 liczb (bez powtórzeń).

I na koniec: pamiętaj, jeśli wygrasz dzięki temu, podziel się wygraną z autorem 🙂 A poważniej: czy posiadanie na komputerze pliku ze wszystkimi kombinacjami Lotto zwiększy nasze szanse na główną wygraną? Niestety nie. Napisanie takiego skryptu jest jedynie dobrym ćwiczeniem z myślenia algorytmicznego. Przedstawiony fragment programu można uznać za wzór do wykorzystania w językach programowania, które bardziej się do tego nadają niż PHP (np C++ lub Java).

zapisz się na kurs Laravela >>>> lub program partnerski
Share

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *