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
:
srand()
, z parametrem typu unsigned int
, której wywołanie powinno poprzedzać pierwsze użycie generatora liczb pseudolosowych w programie,
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.
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.
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.
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
.