Laboratorium 4: Samodzielne programowanie - tydzień drugi

Do rozwiązania niektórych problemów programistycznych potrzebny jest tzw. generator liczb pseudolosowych, czyli narzędzie generujące "losowo wyglądający" ciąg liczb. W C mamy do dyspozycji, zadeklarowane w pliku nagłówkowym stdlib.h:

  • funkcję srand(), z parametrem typu unsigned int, której wywołanie powinno poprzedzać pierwsze użycie generatora liczb pseudolosowych w programie,
  • funkcję rand(), za pomocą której pobieramy od generatora kolejne pseudolosowe liczby całkowite od 0 do RAND_MAX.

Funkcja srand() ustala wartość początkową generowanego ciągu liczb pseudolosowych. Zwykle przekazujemy jej jako argument wynik funkcji time(), zadeklarowanej w pliku nagłówkowym time.h, wywołanej z argumentem NULL. Wielokrotne używanie jej w programie jest poważnym błędem. Gdyby kolejne wywołania nastąpiły krótko po sobie, generator liczb pseudolosowych byłby inicjowany tą samą wartością a więc po każdym wywołaniu srand() funkcja rand() dawałaby identyczny wynik. Zapiszmy np. program:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
#define N_PROB 5
 
int main(void) {
    int i;
 
    srand((unsigned int) time(NULL));
    for (i = 0; i < N_PROB; ++i) {
        if ((double) rand() / (RAND_MAX + 1.0) < 0.5) {
            printf("orzeł\n");
        } else {
            printf("reszka\n");
        }
    }
    return 0;
}

i porównajmy jego wyniki z wynikami programu uzyskanego po przeniesieniu wywołania srand do wnętrza pętli.

Zadanie 1: Przybliżenie π metodą Monte Carlo

Przybliżenie π można obliczyć, losując ciąg punktów płaszczyzny znajdujących się w kwadracie o rozmiarze 1 na 1 i zliczając, ile z nich trafi we wpisaną w ten kwadrat ćwiartkę koła o promieniu 1. Na podstawie stosunku do liczby wszystkich punktów, liczby tych, które trafią w ćwiartkę koła, szacujemy stosunek pól obu figur i w ten sposób ustalamy przybliżenie liczby π.

Napisz program, który zrealizuje ten algorytm. Program powinien podać przybliżenia π uzyskane po N losowaniach punktów, dla N będących potęgami 10, aż do N=100000000 (sto milionów).

Proponujemy zacząć od wersji programu wykonującej obliczenie dla jednej, ustalonej liczby losowań (np. milion), a dopiero później przejść do rozwiązania właściwego zadania.

Zadanie 2: Histogram dla ciągu rzutów parą kostek

Napisz program, który zasymuluje ciąg 10000 rzutów parą kostek i przedstawi wyniki w formie histogramu częstości występowania poszczególnych sum oczek. Histogram, narysowany za pomocą spacji i gwiazdek, powinien mieć "pionowe" słupki. Słupek odpowiadający najczęściej występującej sumie oczek ma mieć 20 wierszy wysokości.

Pod każdym słupkiem należy wypisać odpowiadającą mu wartość procentową.

Proponujemy zacząć od wersji podającej wynik losowania w formie liczbowej, następnie jako histogram o słupkach "poziomych" i dopiero potem przejść do wersji ostatecznej.

Zadanie 3: Rozkład liczby całkowitej na iloczyn liczb pierwszych

Napisz program, który będzie wczytywał z wejścia liczby całkowite i wypisywał ich rozkłady na iloczyny liczb pierwszych. Np. dla liczby 5432 program ma wypisać:

5432 = 2 * 2 * 2 * 7 * 97

Program powinien zakończyć pracę, gdy kolejna liczba wczytana z wejścia będzie mniejsza niż 2.