Spotkanie 15.

Python: generator liczb losowych, pętle

Gra ,,Loteryjka”. W pierwszym etapie gry, na kartce papieru rysujemy planszę w kształcie kwadratu podzielonego na 16 jednakowych mniejszych kwadratowych pól – tak jak na rysunku poniżej.

\begin{tikzpicture}[scale=1.2] \draw[fill=yellow!20,thin] (0,0) rectangle (4,4); \draw[blue,ultra thick] (0,0) grid (4,4); \end{tikzpicture}

W poszczególne pola należy wpisać liczby całkowite od 3 do 18 – każdą liczbę dokładnie jeden raz tak, aby wypełnić całą planszę.

Kolejny etap to losowanie i zakreślanie pól na przygotowanej wcześniej planszy. Do losowania można użyć trzech sześciennych kostek do gry: rzucamy je wszystkie, a następnie zakreślamy pole z liczbą wskazującą na sumę oczek wylosowanych na wszystkich trzech kostkach. Wygrywa ta osoba, która jako pierwsza na swojej planszy zakreśli cztery pola w jednej linii – poziomo, pionowo lub na skos (wzdłuż jednej z dwóch przekątnych planszy).

Jeżeli, przykładowo, przygotowaliśmy taką planszę jak poniżej, to po wyrzuceniu na kostkach oczek: 6, 5 i 3 zakreślamy pole z liczbą 14:

\begin{tikzpicture}[scale=1.0] \draw[fill=yellow!20,thin] (0,0) rectangle (4,4); \draw[blue,ultra thick] (0,0) grid (4,4); \foreach \x/\y/\w in {0/0/5,0/1/7,0/2/14,0/3/10,  1/0/11,1/1/18,1/2/9,1/3/6, 2/0/12,2/1/3,2/2/15,2/3/4, 3/0/17,3/1/8,3/2/16,3/3/13}   \node at (\x+0.5,\y+0.5) {\bf \w};  \draw[brown,ultra thick,->] (5,2)--(6,2);  \draw[fill=yellow!20,thin] (7,0) rectangle (11,4); \draw[blue,ultra thick] (7,0) grid (11,4); \foreach \x/\y/\w in {0/0/5,0/1/7,0/2/14,0/3/10,  1/0/11,1/1/18,1/2/9,1/3/6, 2/0/12,2/1/3,2/2/15,2/3/4, 3/0/17,3/1/8,3/2/16,3/3/13}   \node at (\x+7.5,\y+0.5) {\bf \w}; \draw[red,very thick] (7.1,2.1)--(7.9,2.9) (7.9,2.1)--(7.1,2.9); \end{tikzpicture}

My do losowania wykorzystamy program w języku Python. Będziemy potrzebować biblioteki obsługującej liczby losowe:

import random

Użyjemy trzech zmiennych, które będą odpowiadały za wynik wyrzucony na kolejnych ,,wirtualnych” kostkach:

kostka1 = random.randint(1,6)
kostka2 = random.randint(1,6)
kostka3 = random.randint(1,6)

Na koniec obliczymy sumę oczek uzyskanych na kostkach i wyświetlimy wyniki rzutu:

suma = kostka1+kostka2+kostka3
print("Wyrzucono: \t kostka1 \t",kostka1)
print("\t\t\t kostka2 \t",kostka2)
print("\t\t\t kostka3 \t",kostka3)
print("W sumie: \t",kostka1," + ",kostka2," + ",kostka3," = ",suma)

Ponieważ po jednym rzucie gra się na pewno nie zakończy, to warto cały nasz dotychczasowy program (bez instrukcji import) umieścić w pętli, aby wszystko powtórzyło się kilka-kilkanaście razy. Ostatecznie program (z ozdobnikami, aby wyniki były czytelniejsze) może wyglądać np. tak:

import random

for rzut in range(12):
    print(35*"*","\nRZUT NR", rzut+1,":\n")
    kostka1 = random.randint(1,6)
    kostka2 = random.randint(1,6)
    kostka3 = random.randint(1,6)
    suma = kostka1+kostka2+kostka3
    print("Wyrzucono: \t kostka1 \t",kostka1)
    print("\t\t\t kostka2 \t",kostka2)
    print("\t\t\t kostka3 \t",kostka3)
    print("\nW sumie: \t",kostka1," + ",kostka2," + ",kostka3," = ",suma)
    print(35*"*")
    input("\nKolejny rzut? - wciśnij Enter.")

Ćwiczenie 1. Zagraj kilka 2-3 razy w Loteryjkę. Zastanów się, w jaki sposób wpisywanie konkretnych liczb w pierwszym etapie gry może wpływać na długość oczekiwania na linię.

Ćwiczenie 2. Jak myślisz, czy każda możliwa suma wszystkich oczek dla trzech sześciennych kostek pojawia się tak samo często? Jak można to sprawdzić?

Napiszemy program, który wykona dla nas serię 10000 rzutów trzema kostkami i zliczy ile razy uzyskana była konkretna wartość sumy oczek. Użyjemy w tym celu specjalnej listy. Będzie ona stanowiła licznik dla poszczególnych sum. Dla ułatwienia, lista będzie mieć długość 20 (pamiętamy, że elementy listy numeruje się od zera). Oczywiście początkowo taka lista musi zawierać same zera:

lista = [0] * 20
for rzut in range(10000) : 
    kostka1 = random.randint(1,6)
    kostka2 = random.randint(1,6)
    kostka3 = random.randint(1,6)
    suma = kostka1 + kostka2 + kostka3
    lista[suma] = lista[suma]+1

for suma in range(3,19) : 
    print("suma = ",suma," wystapila ", lista[suma]," razy")

Ćwiczenie 3. Znając częstości występowania poszczególnych sum, spróbuj zaplanować jak najlepszy rozkład liczb w ,,Loteryjce” (tak, aby jak najkrócej czekać na linię).

Jedna myśl w temacie “Spotkanie 15.”

Dodaj komentarz

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