int RandomInteger( int max_vl){ //случайное Int от 0 до Max Int//srand(0);//если нужна повторяемость. MathSrand(GetTickCount()) если нужна неповторяемостьint r= MathRand (); // от 0 до 32767.double k= 32767.0 ;
if (max_vl> 32767 ){
r=r+ MathRand ()* 32767 ; //0...32767 + 0.. 32767*32767(с шагом 32767 ) max=1073709056 > 1 mlrd
k=k*k;
if (max_vl> 1073709056 ){ // int type max alue =2 147 483 647 > 2 mlrd
r=r* 2 + MathRand ()% 2 ; //0...2 147 483 647 > to max int number c шагом 2 + (0 или 1)
k=k* 2 ;
}
}
return ( int ) MathFloor (r/k*max_vl);
}
Evet gördüm ama alglibsiz istiyorum. Ayrıca, bu fonksiyon kütle */% içerir. Hızı karşılaştırmadım, açıkçası daha yavaş. Makaledeki oluşturucu, bit düzeyinde ofsetlerle çalışır - hızlıdır.
int RandomInteger( int max_vl){ return ( int ) MathFloor (( MathRand ()+ MathRand ()* 32767.0 )/ 1073741824.0 *max_vl);} //случайное Int от 0 до Max Int
Makaleden RNG'yi yeniden yazdı. Fazlalığı attı, işte olanlar:
//если из define переместить в код RNDUint, то скорость работы увеличится на 30% для 10 млн повторов с 600 мс до 850 мс#define xor32 xx=xx^(xx<< 13 );xx=xx^(xx>> 17 );xx=xx^(xx<< 5 )
#define xor128 t=(x^(x<< 11 ));x=y;y=z;z=w;w=(w^(w>> 19 ))^(t^(t>> 8 ))
#define inidat x= 123456789 ;y= 362436069 ;z= 521288629 ;w= 88675123 ;xx= 2463534242class RNDUint{
protected :
uint x,y,z,w,xx,t;
public :
RNDUint( void ){inidat;};
~RNDUint( void ){};
uint Rand() {xor128; return (w);}; //равномерное распределение на отрезке [0,UINT_MAX=4294967295].double Rand_01() {xor128; return (( double )w/ UINT_MAX );}; //равномерное распределение на отрезке [0,1].void Reset() {inidat;}; //сброс всех исходных значений в первоначальное состояние.void SRand( uint seed) { //установка новых исходных значений генератора.seed= [0,UINT_MAX=4294967295]. При seed=0 функция меняет начальные значения случайным образом.int i; if (seed!= 0 ){xx=seed;} for (i= 0 ;i< 16 ;i++){xor32;}xor32;x=xx;xor32;y=xx;xor32;z=xx;xor32;w=xx; for (i= 0 ;i< 16 ;i++){xor128;}
};
};
Dağılım da tekdüzedir.
Her iki işlevin de hız karşılaştırmasını yaptım, makaledeki orijinali ve yalnızca MathRand():
Orijinal makale Rnd.Rand_01() - 602ms rnu.Rand_01() makalesi ile kısaltılmıştır - 596 ms Optimize edilmiş RandomInteger() sürümüm 840ms (eski sürüm 1200ms, yani %25 hızlandırılmış) Basitçe MathRand() ile - 353 ms (en hızlı, ancak dağılım eşit olmayacak. Gerekli sayıların aralığı 32767'den fazlaysa, sonuç boşluklarla olacaktır. 32767'den küçükse, örneğin i=31111 , sonra bazı noktalara yuvarlama daha sık gerçekleşir.)
Потребовалась функция ГСЧ с гнерацией числа Int от 0 до любого значения.Получилась такая функция. Думаю распределение получилось равномерным. int RandomInteger(int max_vl){return
MQL5.com web sitesine giriş yapmak için çerezlerin kullanımına izin vermelisiniz.
Lütfen tarayıcınızda gerekli ayarı etkinleştirin, aksi takdirde giriş yapamazsınız.
Hesabınıza giriş yaptınız. İki faktörlü kimlik doğrulama devre dışı bırakıldı. Yeniden kurup yeni bir QR kodu tarayın veya iki faktörlü kimlik doğrulama devre dışıyken devam edin.
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?
işte bir örnek, elbette başka, daha karmaşık algoritmalar da var ...
rand.c kaynağı:
RNG işlevi, Int sayısının 0'dan herhangi bir değere üretilmesi için gerekliydi.
Int'nin maksimum değeri = 2 147 483 647 olduğu için ona kadar hesaplıyoruz
Böyle bir fonksiyon var. Bence dağılım eşit .
Makalenin 4294967295'e kadar bir jeneratörü var
SB Alglib, yüksek hassasiyetli bir jeneratöre sahiptir
UPD: Bununla uğraşmaya çalıştım https://www.mql5.com/ru/forum/324066#comment_13500222 , işe yarıyor gibi görünüyor, ancak MQL5'te Alglib ile ilgili herhangi bir belge yok, Alglib web sitesini okumanız gerekiyor
Makalenin 4294967295'e kadar bir jeneratörü var
Teşekkürler, hesaplamaların hızını karşılaştırdım.

Standart Rand() üzerindeki işlevim 2 kat daha yavaş çıktı. Kod çok daha basit gibi görünse de ...
SB Alglib, yüksek hassasiyetli bir jeneratöre sahiptir
UPD: Bununla uğraşmaya çalıştım https://www.mql5.com/ru/forum/324066#comment_13500222 , işe yarıyor gibi görünüyor, ancak MQL5'te Alglib ile ilgili herhangi bir belge yok, Alglib web sitesini okumanız gerekiyor
Evet gördüm ama alglibsiz istiyorum. Ayrıca, bu fonksiyon kütle */% içerir. Hızı karşılaştırmadım, açıkçası daha yavaş. Makaledeki oluşturucu, bit düzeyinde ofsetlerle çalışır - hızlıdır.
Hızı optimize etmek için f-th'imi yeniden yazdım:
Dağılım eşit çıktı. https://www.mql5.com/en/blogs/post/735953 blogunda deneyin resimlerine bakınMakaleden RNG'yi yeniden yazdı.
Fazlalığı attı, işte olanlar:
Dağılım da tekdüzedir.
Her iki işlevin de hız karşılaştırmasını yaptım, makaledeki orijinali ve yalnızca MathRand():

Orijinal makale Rnd.Rand_01() - 602msrnu.Rand_01() makalesi ile kısaltılmıştır - 596 ms
Optimize edilmiş RandomInteger() sürümüm 840ms (eski sürüm 1200ms, yani %25 hızlandırılmış)
Basitçe MathRand() ile - 353 ms (en hızlı, ancak dağılım eşit olmayacak. Gerekli sayıların aralığı 32767'den fazlaysa, sonuç boşluklarla olacaktır. 32767'den küçükse, örneğin i=31111 , sonra bazı noktalara yuvarlama daha sık gerçekleşir.)
eğlence)
neden işleri bu kadar karmaşık hale getiriyorsun?
bunu şöyle yapabilirsiniz (kabaca konuşursak):
Ve etrafta oynamak veya ne gösterdiğini görmek istiyorsanız, şöyle yapın:
ve değerleri nasıl değiştirdiğini görün.
Hızı optimize etmek için f-th'imi yeniden yazdım:
Dağılım eşit çıktı. https://www.mql5.com/en/blogs/post/735953 blogunda deneyin resimlerine bakınMakaleden RNG'yi yeniden yazdı.
Fazlalığı attı, işte olanlar:
Dağılım da tekdüzedir.
Referanstan gelen dağılımla karşılaştırıldığında, farkı görmüyorum