Liczby losowe
Liczby losowe
Witam,
mój problem sprowadza się do znalezienia generatora liczb losowych generujących 1 albo 0. W mql4 istnieje funkcja rand(), czyli piszę:
rand()%2, problem w tym że otrzymany ciąg 0 i1 NIE jest wcale losowy!!!! Czy może spotkaliście się z tym problemem lub macie jakiś pomysł na jego rozwiązanie??
Z góry bardzo dziękuje za pomoc
Pozdrawiam
mój problem sprowadza się do znalezienia generatora liczb losowych generujących 1 albo 0. W mql4 istnieje funkcja rand(), czyli piszę:
rand()%2, problem w tym że otrzymany ciąg 0 i1 NIE jest wcale losowy!!!! Czy może spotkaliście się z tym problemem lub macie jakiś pomysł na jego rozwiązanie??
Z góry bardzo dziękuje za pomoc
Pozdrawiam
Spróbuj tak:
Jednaj jeśli będziesz często wywoływał funkcje w krótkim interwale czasowym (poniżej 1 ms) ciąg liczb nadal będzie się powtarzał.
MathRand to generator pseudolosowy w którym dany jest wzór ciągu i wartość początkowa tzw ziarno (seed). Jeśli nie będziesz jej zmieniał wyniki zawsze będą takie same. W kodzie powyżej genarator jest inicjalizowany liczbą milisekund od uruchomienia systemu.
Otrzymanie w komputerze prawdziwie losowego ciągu liczb jest praktycznie niemożliwe bez wykorzystania urządzeń mierzących zewnętrzne fizyczne zjawiska (szum termiczny\radiowy, efekty kwantowe).
Kod: Zaznacz cały
MathSrand( GetTickCount());
int x=MathRand()%2;
MathRand to generator pseudolosowy w którym dany jest wzór ciągu i wartość początkowa tzw ziarno (seed). Jeśli nie będziesz jej zmieniał wyniki zawsze będą takie same. W kodzie powyżej genarator jest inicjalizowany liczbą milisekund od uruchomienia systemu.
Otrzymanie w komputerze prawdziwie losowego ciągu liczb jest praktycznie niemożliwe bez wykorzystania urządzeń mierzących zewnętrzne fizyczne zjawiska (szum termiczny\radiowy, efekty kwantowe).
- Pierz Andrzej
- Przyjaciel Forum
- Posty: 1200
- Rejestracja: 02 lip 2006, 14:17
mozna to tak sztucznie obejsc;)skco pisze:Jednaj jeśli będziesz często wywoływał funkcje w krótkim interwale czasowym (poniżej 1 ms) ciąg liczb nadal będzie się powtarzał.
Kod: Zaznacz cały
static int tick;
tick++;
MathSrand( GetTickCount()+tick);
int x=MathRand()%2;
pozdrawiam
Andrzej Pierz
z poważaniem
Andrzej Pierz
FOREX-SERVICE
Andrzej Pierz
FOREX-SERVICE
nie wiem czy nie szybciej by działało z:Pierz Andrzej pisze:int x=MathRand()%2;
Kod: Zaznacz cały
int x;
if(MathRand()>=0.5) x=1; else x=0;
Ostatnio zmieniony 27 lis 2011, 17:29 przez Tig3r, łącznie zmieniany 1 raz.
======================================================
Nie głupi ten co nie wie, lecz ten który nie chce się nauczyć..
Nie głupi ten co nie wie, lecz ten który nie chce się nauczyć..
Kod: Zaznacz cały
int x=MathRand()&1;
Tig3r Twój koda nie za działa bo Rand w mql zwraca int zamiast float.
- f16_rocket
- Stały bywalec
- Posty: 56
- Rejestracja: 09 wrz 2011, 01:54
Ziarno SEED generatora inicjalizuje sie najczesciej czasem.
Przeciez jest podany nawet przyklad:
pewnie slaby to generator. mozna odwolac sie do Windows API i skorzystac z tego generatora albo... napisac jakis DLL z generatorem np z boost.
Kod Tig3r w ogole jest bledny: x=1 else x=1 ; D.
Przeciez jest podany nawet przyklad:
Kod: Zaznacz cały
MathSrand(TimeLocal());
// Display 10 numbers.
for(int i=0;i<10;i++ )
Print("random value ", MathRand());
Kod Tig3r w ogole jest bledny: x=1 else x=1 ; D.
Jądro OpenBSD wykorzystuje odstępy czasu pomiędzy przerwaniami myszki (ang. mouse interrupt), opóźnienie przerwań przesyłania danych sieciowych (ang. network data interrupt latency), odstępy czasu pomiędzy wciskaniem klawiszy oraz informacje o wejściu/wyjściu dysków twardych do zapełnienia nieprzewidywalnego bufora. Mql4 jest kulawy ale w C/C++/C# dało by radę napisać coś takiego ciekawy jestem na co ci to : )
hm.. GetTickCount jest najlepszeskco pisze:"]Spróbuj tak:
Kod:
MathSrand( GetTickCount());
int x=MathRand()%2;
Jednaj jeśli będziesz często wywoływał funkcje w krótkim interwale czasowym (poniżej 1 ms) ciąg liczb nadal będzie się powtarzał.
TimeLocal trochę gorszy bo jest generowany w testerze.
Co do wywołań krótszych niż 1ms, to też nie jest problem, po prostu MathSrand wywołujemy raz w init() i koniec.
W zasadzie, raczej zawsze powinno się tak robić, przecież to jest seed, później leci już wg. algorytmu, czyli liczba "losowa" jest seedem do następnego wygnerowania. Nie widzę sensu aby Srand i rand stawiac obok siebie.
Taka pseudoludowość wystarczy, i nie widzę potrzeby generować lepszej w MT4, ktoś widzi?
- f16_rocket
- Stały bywalec
- Posty: 56
- Rejestracja: 09 wrz 2011, 01:54
nie
jesli mowisz o funkcjach MathSrand() i MathRand(), to to nie jest "mieszanie", tylko jedna i druga sluza do czego innego. Srand inicjalizuje ziarno, a liczbe losowa wydobywa sie Randem.
no i oczywiscie ze inicjalizacja Srand powinna byc raz na caly zywot aplikacji, czyli byc w init() z tego co zdazylem MQL poznac.
jesli mowisz o funkcjach MathSrand() i MathRand(), to to nie jest "mieszanie", tylko jedna i druga sluza do czego innego. Srand inicjalizuje ziarno, a liczbe losowa wydobywa sie Randem.
no i oczywiscie ze inicjalizacja Srand powinna byc raz na caly zywot aplikacji, czyli byc w init() z tego co zdazylem MQL poznac.