MathRand() nasıl değerler üretir?

 

Lütfen bana MathRand() 'ın değerleri nasıl aldığını söyleyin.

MathRand()'ın belirtilen aralıkta eşit olarak dağıtılması beklenebilir mi?

 

4. forumda defalarca tartışıldı. MathRand'i aramak 15 sayfadan fazla sonuç döndürür

Örneğin, bu konular:

https://www.mql5.com/ru/forum/123337

https://www.mql5.com/ru/forum/111855

https://www.mql5.com/ru/forum/111974

https://www.mql5.com/ru/forum/125667

Генерация равномерно распределенных случайных чисел (0,1) - MQL4 форум
  • www.mql5.com
Генерация равномерно распределенных случайных чисел (0,1) - MQL4 форум
 
yu-sha :

Lütfen bana MathRand()'ın nasıl değerler aldığını söyleyin.

MathRand()'ın belirtilen aralıkta eşit olarak dağıtılması beklenebilir mi?

Bence bir dağıtım testi yapabilirsiniz, ancak nasıl yapacağımı hatırlamıyorum.

Uzun zaman önce php ile kontrol ettim.

Görünüşe göre çok sayıda rastgele sayı üretiliyor ve ardından bir grafik oluşturuluyor.

Veya örneğin, kaba bir tahmin için aynı sayıların sayısını bulabilirsiniz.

Birkaç yüz sayı üretin ve bir dosyaya yazın, ardından en azından excel'de bir grafik oluşturun.

 

dize ,

Okumak için önerilen tüm bağlantılarda ustalaşmadım))

Mesajların sayısına ve tartışmadaki katılımcıların kompozisyonuna bakarak şu sonuca vardım:

- MathRand()'ı güvenle kullanabilirsiniz

- yeterli "çözünürlük" 0..32767 yoksa, MathRand()*MathRand() alabilirsiniz, - dağılım bir yönde güçlü bir şekilde "çarpık" olmaz

mrProF ,

Kaba bir tahmin yapmak kolaydır

int A[32768];

(int i=0; i<100000000; i++) için

A[MathRand()]++;

ama neden?

benim amaçlarım için geliştiricilerin yorumu yeterli

 
yu-sha :

benim amaçlarım için geliştiricilerin yorumu yeterli

Geliştiriciler MathRand'i kendi başlarına geliştirmediler, ancak çağrı çevirisini doğrudan CRT işlevleri srand ve rand'a uyguladılar.

Genel kullanım için iyi.

 
Ve "hoo" istiyorsanız, o zaman https://www.mql5.com/en/forum/123337/page16 alt yazıdır.
Генерация равномерно распределенных случайных чисел (0,1) - MQL4 форум
  • www.mql5.com
Генерация равномерно распределенных случайных чисел (0,1) - MQL4 форум
 
sakız :
Ve "hoo" istiyorsanız, o zaman https://www.mql5.com/ru/forum/123337/page16 alt yazıdır.

Bulanık mantık algoritmalarında ağırlıkları rastgele değiştirmem gerekiyor

asıl mesele, bir yönde sürekli "tıkanma" olmamasıdır.

tabii ki "hoo" için teşekkürler, ama benim durumumda gereksiz))

 

hesaba

" - yeterli "çözünürlük" 0..32767 yoksa, o zaman MathRand()*MathRand() alabilirsin, - dağılım bir yönde güçlü bir şekilde "çarpık" olmaz "

Heyecanlandım...

beklenti aralığın ortasının soluna kayacak (bundan şüpheleniyorum 1/4 * 32768^2 , ama artık hiçbir şeyden emin değilim)

genel olarak, ifadem yanlıştı

 
yu-sha :

hesaba

" - yeterli "çözünürlük" 0..32767 yoksa, o zaman MathRand()*MathRand() alabilirsiniz, - dağılım bir yönde güçlü bir şekilde "çarpık" olmaz "

Heyecanlandım...

beklenti aralığın ortasının soluna kayacak (bundan şüpheleniyorum 1/4 * 32768^2 , ama artık hiçbir şeyden emin değilim)

genel olarak, ifadem yanlıştı

hmslo drange [0, (2^rstep)-1]

 long ranD( int rstep)
{
long div= 1 ;
long r= 0 ; 
   for ( int i= 1 ;i<=rstep;i++)
   {
   if ( MathRand ()+ 1 > 16383.5 ){ if (i== 1 ){r= 1 ;} else {r+=div;}}
   div=div* 2 ;
   }
return (r);
}

Long yerine int, double veya ulong kullanabilirsiniz.

 

sakız ,

rstep [0, 2^rstep-1] - bu parametrenin ne olduğunu anlamadı

Soru:

double değişkeninin, örneğin 8. ondalık basamağa kadar doğrulukla rastgele değiştirilmesi gerekir

MathRand()/32768, 0,00003'lük bir adım verecektir - yeterli değil

MathRand() kullanılarak 0.00000001 ayrıklığı ile (0..1) rastgele değer üzerinde eşit olarak nasıl dağıtılır?

 
yu-sha :

sakız ,

rstep [0, 2^rstep-1] - bu parametrenin ne olduğunu anlamadı

Soru:

double değişkeninin, örneğin 8. ondalık basamağa kadar doğrulukla rastgele değiştirilmesi gerekir

MathRand()/32768, 0,00003'lük bir adım verecektir - yeterli değil

MathRand() kullanılarak 0.00000001 ayrıklığı ile (0..1) rastgele değer üzerinde eşit olarak nasıl dağıtılır?


rsign=1 (-1,1) ile rsign=0 (0,1) ile

 double ranD( int rsign, int rstep)
{
double div= 2 ;
double r= 0 ; 
   for ( int i= 1 ;i<=rstep;i++)
   {
   if ( MathRand ()+ 1 > 16383.5 ){r+= 1 /div;}
   div=div* 2 ;   
   }
      if (rsign== 1 )
         {
         r= 2 *r- 1 ;
         }
return (r);
}

rstep derecedir