Pseudolosowa wartość rzeczywista w c++

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.
#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.

Komentarze

  1. Hm.. post pomocny 8 razy? Chciało Ci sie tyle klikać?

    Ps. Widza, że Nerd-thoughts się zmienia - nowa szata graficzna.

    OdpowiedzUsuń
  2. Nie, nie chciało mi się.

    Ps. Dobrze widzisz, mój blog jest jak rzeka. :D

    OdpowiedzUsuń
  3. Jestem pod wrażeniem. Bardzo ciekawie napisany artykuł.

    OdpowiedzUsuń

Prześlij komentarz