Liczby losowe

O jezykach programowania w platformach i nie tylko.
Awatar użytkownika
oiro
Pasjonat
Pasjonat
Posty: 423
Rejestracja: 05 mar 2008, 00:40

Liczby losowe

Nieprzeczytany post autor: oiro »

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

Awatar użytkownika
Esco
Przyjaciel Forum
Przyjaciel Forum
Posty: 2603
Rejestracja: 11 kwie 2010, 20:56

Nieprzeczytany post autor: Esco »

Spróbuj tak:

Kod: Zaznacz cały

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

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

Awatar użytkownika
Pierz Andrzej
Przyjaciel Forum
Przyjaciel Forum
Posty: 1200
Rejestracja: 02 lip 2006, 14:17

Nieprzeczytany post autor: Pierz Andrzej »

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ł.
mozna to tak sztucznie obejsc;)

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

Awatar użytkownika
Tig3r
Przyjaciel Forum
Przyjaciel Forum
Posty: 2310
Rejestracja: 02 sty 2008, 10:46

Nieprzeczytany post autor: Tig3r »

Pierz Andrzej pisze:int x=MathRand()%2;
nie wiem czy nie szybciej by działało z:

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

Awatar użytkownika
Esco
Przyjaciel Forum
Przyjaciel Forum
Posty: 2603
Rejestracja: 11 kwie 2010, 20:56

Nieprzeczytany post autor: Esco »

Kod: Zaznacz cały

int x=MathRand()&1;
Taki kod będzie najszybszy. Odrzucenie wszystkich bitów poza pierwszym. Prosta operacja dzięki której można uniknąć czasochłonnego dzielenia i porównań.

Tig3r Twój koda nie za działa bo Rand w mql zwraca int zamiast float.

Awatar użytkownika
f16_rocket
Stały bywalec
Stały bywalec
Posty: 56
Rejestracja: 09 wrz 2011, 01:54

Nieprzeczytany post autor: f16_rocket »

Ziarno SEED generatora inicjalizuje sie najczesciej czasem.
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());

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.

Awatar użytkownika
tarfue
Gaduła
Gaduła
Posty: 269
Rejestracja: 29 maja 2011, 22:28

Nieprzeczytany post autor: tarfue »

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 : )

LowcaG
Pasjonat
Pasjonat
Posty: 1068
Rejestracja: 05 paź 2007, 15:39

Nieprzeczytany post autor: LowcaG »

skco 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ł.
hm.. GetTickCount jest najlepsze
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?

Awatar użytkownika
f16_rocket
Stały bywalec
Stały bywalec
Posty: 56
Rejestracja: 09 wrz 2011, 01:54

Nieprzeczytany post autor: f16_rocket »

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.

Awatar użytkownika
Esco
Przyjaciel Forum
Przyjaciel Forum
Posty: 2603
Rejestracja: 11 kwie 2010, 20:56

Nieprzeczytany post autor: Esco »

Ja tylko taki fragment kodu podałem w jakiej kolejności należy to wywołać.
Fakt że raczej raz taką funkcje należny wywołać na poczatku programu (chociażnie wiemy właściwie po co to autorowi pytania).

ODPOWIEDZ