|
Wpisał doctor
|
|
Środa, 21. Luty 2007 02:14 |
|
Liczby losowe w C++
W srodowsiku C++ Builder mamy do dyspozycji pseudolosowy generator o cyklu 2^32. Pseudolosowy dlatego, że komputer jako maszyna deterministyczna generuje ciągi liczb ze skończonego przedziału wartości. Pamięc komputera, jaka by ona nie była, jest zawsze ograniczona. Generator tego typu jest wystarczający do mniej złożonych symulacji. Jeśli chcemy generować liczby ze znacznie większego przedziału oraz większej zmienności jesteśmy zmuszeni korzystać ze specjalizowanych generatorów pseudolosowych. Do najpopularniejszych należą: tezuka.c czy uni.c o cyklu 2^144.
A teraz konkrety. Aby wylosować liczbę o dużej zmienności należy generator zainicjować. W C++ służy do tego funkcja Randomize(), umieszczana zwykle w zdarzeniu OnCreate aplikacji. {viewonly=registered} Do generowania liczb wykorzystywana jest funkcja int random(int num), gdzie num jest zakresem generowanych liczb. Funkcja ta zwraca liczbę typu int z przedziału [0, num - 1].
Przykład
Kładziemy na formę komponent Label oraz Button. Następnie uzupełniamy zdarzenia.
void __fastcall TForm1::FormCreate(TObject *Sender) { randomize(); }
|
void __fastcall TForm1::Button1Click(TObject *Sender) { Label1->Caption = IntToStr(random(5)); }
|
W ten prosty sposób będziemy generować liczby z przedziału [0, 4].
Następną funkcją jest int RandomRange(const int AFrom, constint ATo) zwracającą liczbę z podanego zakresu [AFrom, Ato).
Przykład
Uwaga: aby używać tej funkcji trzeba dołączyć bibliotekę math.hpp.
#include <vcl.h> #pragma hdrstop
#include <math.hpp> #include "Unit1.h"
|
void __fastcall TForm1::FormCreate(TObject *Sender) { randomize(); }
|
void __fastcall TForm1::Button1Click(TObject *Sender) { int liczba = RandomRange(10, 31); Label1->Caption = IntToStr(liczba); }
|
Kolejną przydatną funkcją jest double RandomFrom(const double *AValues, int AValues_Size) która zwraca element tablicy o rozmiarze AValues_Size. A więc jako argument przekazujemy tej funkcji tablicę elementów. Tu tak samo jak wyżej dołączamy bibliotekę math.hpp.
Przykład
void __fastcall TForm1::FormCreate(TObject *Sender) { randomize(); }
|
void __fastcall TForm1::Button1Click(TObject *Sender) { int *tab = new int[5]; // stworzenie dyn. tablicy // i zainicjowanie jej tab[0] = 15; tab[1] = 3; tab[2] = 7; tab[3] = 77; tab[4] = 9;
int liczba = RandomFrom(tab, ARRAYSIZE(tab) ); Label1->Caption = IntToStr(liczba); }
|
Jedyną nowością było tu użycie funkcji ARRAYSIZE, która pobiera jako argument nazwę tablicy a zwraca jej rozmiar.
{/viewonly}
|
|
LAST_UPDATED2 |