Wszystkie algorytmy losujące to oszustwo.
Zawsze będziemy oszukiwani przez matematyczne algorytmy.
Napisałem prosty kod, który to sprawdzi. Losuje 1000 liczb z zakresu od 1 do 100 i potem bierze średnia arytmetyczną tych liczb. Rozpatrujemy 5 przypadków dla 3 typów losowań. Średnia zawsze będzie utrzymywana koło liczby 50. Wylosowałem 1000 liczb losowych 5 razy i za każdym razem średnia wynosi 50? Słaba ta losowość prawda?
Na zwykłym komputerze nie osiagniemy prawdziwej losowości. Nie ma lepszych i gorszych losowań. Wszystkie są tak samo oszukane :-)
#include <iostream>
#include <conio.h>
#include <random>
#include <cstdlib>
#include <ctime>
using namespace std;
double losuj1()
{
double suma = 0;
std::default_random_engine generator;
std::uniform_int_distribution<int> distribution( 1, 100 );
for( int i = 0; i < 1000; i++ )
{
int wylosowana = distribution( generator );
suma += wylosowana;
}
return suma / 1000;
}
double losuj2()
{
double suma = 0;
std::random_device dev;
std::mt19937 gen( dev() ); // Generator
for( int i = 0; i < 1000; i++ )
{
int wylosowana = gen()%101 + 1;
suma += wylosowana;
}
return suma / 1000;
}
double losuj3()
{
double suma = 0;
for( int i = 0; i < 1000; i++ )
{
int wylosowana = rand()%101 + 1;
suma += wylosowana;
}
return suma / 1000;
}
int main()
{
srand( time( NULL ) );
for( int i = 0; i < 5; i++ )
cout << "Losowanie typ 1 (test " << i + 1 << ") " << losuj1() << endl;
for( int i = 0; i < 5; i++ )
cout << "Losowanie typ 2 (test " << i + 1 << ") " << losuj2() << endl;
for( int i = 0; i < 5; i++ )
cout << "Losowanie typ 3 (test " << i + 1 << ") " << losuj3() << endl;
_getch();
return 0;
}
Odpalcie program 100 razy i jeżeli kiedykolwiek średnia spadnie poniżej 40, to szukajcie gwiazdy betlejemskiej, bo to będzie cholerny cud.
Możecie też zamknąć wszystko w pętli, która będzie się powtarzać dopóki średnia będzie między 45 a 55. Gwarantuję, że nigdy się nie skończy, bo losowość z tego żadna.
Z matematycznego punktu widzenia możliwy jest przypadek, w którym wylosuje się 1000 liczb tych samych. To jest prawdziwa losowość, a nie takie funkcje pseudolosujące Pfff :-P
Wynik działania programu jakby komuś nie chciało się kompilować:
Przypominam, że 15 razy losowałem trzema różnymi sposobami. Łącznie 15 tysięcy liczb losowych z przedziału od 1 do 100. Średnia zawsze bliska połowie zakresu losowania, czyli oszustwo a nie losowanie :D