Aby otrzymać taką losową zmienną np. typu float można skorzystać z funkcji rand(). Funkcja jest zadeklarowana w pliku stdlib.h. Czyli na samym początku trzeba załączyć plik nagłówkowy.
Jest tam kilka ważnych informacji:
#include <cstdlib>Warto zajrzeć do jakiejś dokumentacji żeby dowiedzieć się co w ogóle funkcja rand() zwraca i jak działa. Pod tym linkiem jest to czego szukamy: http://www.cppreference.com/wiki/numeric/random/rand
Jest tam kilka ważnych informacji:
- Funkcja zwraca pseudolosową liczbę całkowitą w przedziale od 0 do RAND_MAX,
- Funkcja srand() powinna być wywołana przed funkcją rand(),
- Funkcja rand() korzysta ze zmiennych globalnych więc każde wywołanie srand() wpłynie na zachowanie funkcji rand() bez względu na miejsce wywołania srand(),
- Wyniki zwracany przez rand() nie cechuje wysoka entropia(wyższa entropia = wyższa losowość).
To że rand() zwraca liczbę całkowitą jest drobnym problemem. Ciekawić może także górna granica zakresu losowania czyli stała RAND_MAX. Jej deklarację można znaleźć w pliku stdlib.h:
#define RAND_MAX 0x7FFF
Dziesiętnie jest to 32767, co daje 15 bitów losowości. Skromnie...
Dobra, teoria jest. Pora coś napisać:
1 |#include <iostream>
2 |#include <cstdlib>
3 |using std::cout;
4 |float random_float()
5 |{
6 | return (float) rand() / RAND_MAX;
7 |}
8 |int main()
9 |{
10| srand(1337);
11| float a;
12| for (int i=0; i<5; i++)
13| {
14| a = random_float();
15| cout << i << " " << a << "\n";
16| }
17| cout << "mission completed\n";
18|return 0;
19|}
Główna funkcja rzutuje na typ float wynik dzielenia rand() i RAND_MAX. Gdy rand() zwróci np. minimum czyli 0 to otrzymujemy 0.0 a gdy rand zwróci swoją wartość maksymalną otrzymujemy 1. Wiadomo że są wartości pomiędzy, dlatego funkcja random_float zwraca wartości z przedziału 0.0 do 1.0.
Wynik programu:
0. 0.134404
1. 0.792077
2. 0.5421
3. 0.905759
4. 0.125523
Jeżeli przepisałeś cały mój program(lub skopiowałeś) i masz inne wyniki, nie panikuj. //lol
Losowość w celach kryptograficznych należy uzyskać natomiast z wincrypt.h i biblioteki Advapi32.dll.
Dobra, teoria jest. Pora coś napisać:
1 |#include <iostream>
2 |#include <cstdlib>
3 |using std::cout;
4 |float random_float()
5 |{
6 | return (float) rand() / RAND_MAX;
7 |}
8 |int main()
9 |{
10| srand(1337);
11| float a;
12| for (int i=0; i<5; i++)
13| {
14| a = random_float();
15| cout << i << " " << a << "\n";
16| }
17| cout << "mission completed\n";
18|return 0;
19|}
Główna funkcja rzutuje na typ float wynik dzielenia rand() i RAND_MAX. Gdy rand() zwróci np. minimum czyli 0 to otrzymujemy 0.0 a gdy rand zwróci swoją wartość maksymalną otrzymujemy 1. Wiadomo że są wartości pomiędzy, dlatego funkcja random_float zwraca wartości z przedziału 0.0 do 1.0.
Wynik programu:
0. 0.134404
1. 0.792077
2. 0.5421
3. 0.905759
4. 0.125523
Jeżeli przepisałeś cały mój program(lub skopiowałeś) i masz inne wyniki, nie panikuj. //lol
Losowość w celach kryptograficznych należy uzyskać natomiast z wincrypt.h i biblioteki Advapi32.dll.
Hm.. post pomocny 8 razy? Chciało Ci sie tyle klikać?
OdpowiedzUsuńPs. Widza, że Nerd-thoughts się zmienia - nowa szata graficzna.
Nie, nie chciało mi się.
OdpowiedzUsuńPs. Dobrze widzisz, mój blog jest jak rzeka. :D
Jestem pod wrażeniem. Bardzo ciekawie napisany artykuł.
OdpowiedzUsuń