Mql5 dilinin özellikleri, incelikleri ve çalışma yöntemleri - sayfa 135

 
Vict :

Çok dikkatlisiniz, teşekkürler. Bir hata yaptım, parantez koymadım ve "dürüst olmayan" işlevini kullanırdım.

Not: orijinal gönderiyi düzenledi.

Lütfen bu yapının neden banal Rand()%max'tan daha iyi olduğunu açıklayın.

PS Ne demek istediğini anlıyorum.
Peki o zaman - ya max>32767 ise? Sonuçta, işleviniz uint türündedir ve rand() gibi bir maksimum değer üretir, yani. 32767

o zaman gibi bir şey kullanmak daha iyidir

 ulong RandULong( ulong max= ULONG_MAX ) { return ((( ulong ) rand ()<< 60 )|(( ulong ) rand ()<< 45 )|(( ulong ) rand ()<< 30 )|(( ulong ) rand ()<< 15 )|( ulong ) rand ())%max;}
 
Vict :

Çok dikkatlisiniz, teşekkürler. Bir hata yaptım, parantez koymadım ve "dürüst olmayan" işlevini kullanırdım.

Not: orijinal gönderiyi düzenledi.

Birisi sizin dürüst işlevinizi kullanmak isterse ve get_rand(10) yazarsa, bunun Rand()%10'dan 3276 kat daha yavaş çalışacağının farkında mısınız?

 
Nikolai Semko :

Peki o zaman - ya max>32767 ise? Sonuçta, işleviniz uint türündedir ve rand() gibi bir maksimum değer üretir, yani. 32767

o zaman gibi bir şey kullanmak daha iyidir

Ve MathRand() bir int döndürür, ya birisi ondan altı sıfırlı bir sayı beklerse? Halkın bir düzeyine güveniyorum. Burada,> 32767'yi nasıl elde edeceğinizi kendiniz biliyorsunuz.

Sadece çoğu zaman tereddüt etmeden Rand()%3 yazıyorlar, ancak mesajımı görecekler ve olasılıklarda bir kayma olacağını anlayacaklar.

Birisi sizin dürüst işlevinizi kullanmak isterse ve get_rand(10) yazarsa, bunun Rand()%10'dan 3276 kat daha yavaş çalışacağının farkında mısınız?

Evet, çok yavaş, bir milyon çağrı döngüsü için, tekrarlanan while çağrısı yaklaşık 300 kez gerçekleşecek. Programlarınız get_rand()'ın seğirdiği bir ()'den oluşuyorsa, bu kritik olacaktır, sanırım.

İşletim sistemi zamanlayıcısının sizden çok fazla CPU zamanı aldığını ve Rand() ile kıyaslanamayacak kadar yürütmeyi yavaşlattığının farkında mısınız? Madem bu kadar acelen var, biraz doza ihtiyacın var.

 
Vict :

Ve MathRand() bir int döndürür, ya birisi ondan altı sıfırlı bir sayı beklerse? Halkın bir düzeyine güveniyorum. Burada,> 32767'yi nasıl elde edeceğinizi kendiniz biliyorsunuz.

Sadece çoğu zaman tereddüt etmeden Rand()%3 yazıyorlar, ancak mesajımı görecekler ve olasılıklarda bir kayma olacağını anlayacaklar.

Evet, çok yavaş, bir milyon çağrı döngüsü için, tekrarlanan while çağrısı yaklaşık 300 kez gerçekleşecek. Programlarınız get_rand()'ın seğirdiği bir ()'den oluşuyorsa, bu kritik olacaktır, sanırım.

İşletim sistemi zamanlayıcısının sizden çok fazla CPU zamanı aldığını ve Rand() ile kıyaslanamayacak kadar yürütmeyi yavaşlattığının farkında mısınız? Madem bu kadar acelen var, biraz doza ihtiyacın var.

Optimizasyonda fonksiyonların hızı kritiktir. Ve bu zamanlayıcı ve DOS ile ilgili değil.
 
Vict :

Ve MathRand() bir int döndürür, ya birisi ondan altı sıfırlı bir sayı beklerse? Halkın bir düzeyine güveniyorum. Burada, > 32767'yi nasıl elde edeceğinizi kendiniz biliyorsunuz.

Sadece çoğu zaman tereddüt etmeden Rand()%3 yazıyorlar, ancak mesajımı görecekler ve olasılıklarda bir kayma olacağını anlayacaklar.

Evet, çok yavaş, bir milyon çağrı döngüsü için, tekrarlanan while çağrısı yaklaşık 300 kez gerçekleşecek. Programlarınız get_rand()'ın seğirdiği bir ()'den oluşuyorsa, bu kritik olacaktır, sanırım.

İşletim sistemi zamanlayıcısının sizden çok fazla CPU zamanı aldığını ve Rand() ile kıyaslanamayacak kadar yürütmeyi yavaşlattığının farkında mısınız? Madem bu kadar acelen var, biraz doza ihtiyacın var.

Hatalarınızı kabul etmekten korkmayın. Bunda korkunç ve aşağılayıcı bir şey yok. Hepimiz hata yaparız. Bu iyi.
"Evet - yanılmışım. Teşekkürler" demek toplum algısı açısından çok daha kolay ve kullanışlıdır. bahane üretmeye çalışmak yerine

Sonuçta, bu seçenek çok daha hızlı ve çok yönlü çalışıyor:

 ulong randUlong( ulong max= ULONG_MAX )
  {
   static bool f= true ;
   if (f) {f= false ; srand ( GetTickCount ());}
   return ((( ulong ) rand ()<< 60 )|(( ulong ) rand ()<< 45 )|(( ulong ) rand ()<< 30 )|(( ulong ) rand ()<< 15 )|( ulong ) rand ())%max;
  }

Ayrıca, büyük sayılar gerekmiyorsa, c ulong'u uint'e yeniden kodlarsanız hızlandırabilirsiniz (beş yerine 3 rand () olacaktır).

 
Nikolai Semko :

Hatalarınızı kabul etmekten korkmayın. Bunda korkunç ve aşağılayıcı bir şey yok. Hepimiz hata yaparız. Bu iyi.
"Evet - yanılmışım. Teşekkürler" demek toplum algısı açısından çok daha kolay ve kullanışlıdır. bahane üretmeye çalışmak yerine

Sonuçta, bu seçenek çok daha hızlı ve çok yönlü çalışıyor:

Ayrıca, büyük sayılar gerekmiyorsa, c ulong'u uint'e yeniden kodlarsanız hızlandırabilirsiniz (beş yerine 3 rand () olacaktır).

Onlar. Uygulamanızın sahtekârlığından utanmıyor musunuz (hız açısından, bu arada, çok daha yavaş olacak)? Bildiğin gibi.

Not: sahtekârlık - farklı olasılıklara sahip farklı aralık sayılarının oluşturulması.
 
Vict :

Onlar. Uygulamanızın sahtekârlığından utanmıyor musunuz (hız açısından, bu arada, çok daha yavaş olacak)? Bildiğin gibi.

Not: sahtekârlık - farklı olasılıklara sahip farklı aralık sayılarının oluşturulması.
Ciddi misin?
 
Why do people say there is modulo bias when using a random number generator?
Why do people say there is modulo bias when using a random number generator?
  • 2012.06.11
  • user1413793user1413793 5,32651933
  • stackoverflow.com
I have seen this question asked a lot but never seen a true concrete answer to it. So I am going to post one here which will hopefully help people understand why exactly there is "modulo bias" when using a random number generator, like in C++.
 
Onlar. Yatağın altına yuvarlanan 10 senti bulmak için 100 dolarlık banknotu ateşe vermeye hazır mısınız?
 
Nikolai Semko :
Onlar. Yatağın altına yuvarlanan 10 senti bulmak için 100 dolarlık banknotu ateşe vermeye hazır mısınız?

Olasılıkların rolünü boş yere hafife alıyorsun. Milyonlarca yinelemede, bu "yuvarlanan madeni paralar" sizin için oldukça somut sayılarla sonuçlanacaktır. Ayrıca, kodunuz küçük aralıklar için açıkça irrasyoneldir (sürekli olarak Rand'a () beş çağrı yapmak, tıpkı "bir faturayı ateşe vermek" gibidir)

Altı ay önce bu konu forumda zaten tartışılmıştı, bu seçeneği önerdim:

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum

Nth aralığında rastgele bir sayı nasıl elde edilir?

Alexey Navoykov , 2018.12.31 01:25

Önceki kodum yanlıştı. Rütbeler konusunda çok akıllı. İşte doğru sürüm ve aynı zamanda daha özlü:

 ulong RandomLong( ulong range)
{
 #define _MAXRND(range, rnd_range)  ((rnd_range) - ((rnd_range)-range)%range - 1 ) 
 #define _RND ( ulong ) rand ()
   ulong rnd, max, const bit= 1 ;
   if (range <= bit<< 15 ) { if (!range) return 0 ;  max=_MAXRND(range, 1 << 15 );   while ((rnd=_RND) > max);   return rnd%range; }
   if (range <= bit<< 30 ) { max=_MAXRND(range, bit<< 30 );   while ((rnd=(_RND | _RND<< 15 )) > max);   return rnd%range; }
   if (range <= bit<< 45 ) { max=_MAXRND(range, bit<< 45 );   while ((rnd=(_RND | _RND<< 15 | _RND<< 30 )) > max);   return rnd%range;  }
   if (range <= bit<< 60 ) { max=_MAXRND(range, bit<< 60 );   while ((rnd=(_RND | _RND<< 15 | _RND<< 30 | _RND<< 45 )) > max);   return rnd%range; }
                   else   { max=_MAXRND(range, bit<< 64 );   while ((rnd=(_RND | _RND<< 15 | _RND<< 30 | _RND<< 45 | _RND<< 60 )) > max);   return rnd%range; }
 #undef _RND               
 #undef _MAXRND
}