Liczby pseudolosowe Standardowa biblioteka języka C w pliku nagłówkowym <stdlib.h> posiada zadeklarowane dwie funkcje służące do generowania liczb pseudolosowych: rand i srand. Funkcja srand() jako parametr przyjmuje seed, czyli tzw. ziarno/zarodek jest to zmienna liczba (unsigned int) na podstawie, której inicjowany jest generator liczb dla nowego ciągu liczb pseudolosowych. Funkcja rand() służy do losowania liczb pseudolosowych, zwraca ona liczbe całkowita (int) z przedziału miedzy 0 a stała RAND_MAX. RAND_MAX jest to stała zadeklarowana w pliku nagłówkowym <stdlib.h> wynosi ona co najmniej 32767 (jest stałą, która jest zależna od posiadanego kompilatora i posiadanych bibliotek). printf("%d\n", RAND_MAX); Aby wygenerować liczbę z dowolnego przedziału, wynik funkcji rand poddajemy operacji modulo np. rand() % 10 - losuje liczby z przedziału od 0 do 9. printf("%d\n", rand() % 10); Aby komputer korzystając z funkcji rand za każdym jej wywołaniem losował różne liczby, wymagane jest skonfigurowanie generatora liczb losowych. Z pomocą przychodzi nam kolejna funkcja i jest nią srand. Funkcja srand ustawia punkt startowy dla mechanizmu generowania kolejnych liczb całkowitych. W dużym uproszczeniu napisanie: srand(123); ustawi punkt startowy 123, a zapis srand(543); ustawi punkt startowy 543. Co to daje? W sumie tyle, że losowane są inne liczby. Aby uzyskać każdorazowo inne wylosowane wartości w raz skompilowanym programie należy powiązać funkcję srand z czasem rzeczywistym, ustawionym obecnie w komputerze. Tu będziemy zmuszeni dołączyć kolejny plik nagłówkowy, i jest nim time.h Biblioteka time.h dostarczy nam między innymi funkcję time, która zwraca obecny czas na komputerze w postaci liczby.
printf("%d\n", rand() % 10); Przykłady użycia funkcji rand: Generowanie liczby pseudolosowej całkowitej z zakresu [0; X] int liczba, X = 100; liczba = rand() % (X + 1); printf("%d\n", liczba); Generowanie liczby pseudolosowej całkowitej z zakresu [X; Y] int liczba, X = 100, Y = 200; liczba = X + rand() % (Y - X + 1); printf("%d\n", liczba);
Generowanie liczby pseudolosowej rzeczywistej z zakresu [X; Y] double liczba, X = 100, Y = 200; liczba = X + (double) rand() / RAND_MAX * (Y - X); Generowanie liczby pseudolosowej rzeczywistej zakresu [0; 1] double liczba; liczba = (double) rand() / RAND_MAX;
Generowanie liczby losowej rzeczywistej z zakresu [0; X] double liczba, X = 100; liczba = (double) rand() / RAND_MAX * X; Pomiar czasu Do pomiaru czasu w języku C służy funkcja time, która zwraca aktualny czas na komputerze (w sekundach) Aby zmierzyć czas działania danej operacji w czasie działania programu, należy wywołać funkcję po raz pierwszy przed wykonaniem operacji, oraz po raz drugi tuż po wykonaniu operacji, a następnie odjąć od siebie oba wyniki. Dzięki temu otrzymamy czas działania danej operacji w sekundach: int start = time(0); /*... */ int end = time(0);
Zadania do wykonania Zadanie 1 Napisz program, który będzie losował jedną liczbę (poinformuj użytkownika czy jest to liczba całkowita czy rzeczywista) a następnie użytkownik będzie zgadywał jaka liczba została wylosowana, ma maksymalnie 10 prób. Jeśli nie zgadnie za 3 razem to program ma wyświetlać informacje pomocnicze, że liczba jaką podał jest za duża lub za mała. Na koniec poinformuj użytkownika, za którym razem odpowiedział lub że nie udało mu się odgadnąć liczbę. Zadanie 2 Napisz program, w którym użytkownik wybierze zakres z jakiego będzie losowana liczba, ilość losowanych liczb oraz rodzaj liczby (czy to będzie liczba całkowita czy rzeczywista). Zadbaj o odpowiednie komunikaty, z możliwością wyboru danych. Zadanie 3 Napisz program, który realizuje następujące operacje: losowanie liczby całkowitej z zakresu [-15; 15] losowanie liczby rzeczywistej z zakresu [1.5; 2.25] losowanie liczby rzeczywistej z zakresu [0; 64.5] Zadanie 4 Napisz program, który zapyta użytkownika o liczbę w postaci binarnej (np. 100000101 - zadeklaruj zmienną typu long int) a następnie napisz funkcję, która podaną liczbę w postaci binarnej zamieni na liczbę dziesiętną. Zmierz czas wykonania 100 operacji konwersji z postaci binarnej na dziesiętną. Podaj czas w sekundach i minutach.