Mql5 dilinin özellikleri, incelikleri ve çalışma yöntemleri - sayfa 136
Alım-satım fırsatlarını kaçırıyorsunuz:
- Ücretsiz alım-satım uygulamaları
- İşlem kopyalama için 8.000'den fazla sinyal
- Finansal piyasaları keşfetmek için ekonomik haberler
Kayıt
Giriş yap
Gizlilik ve Veri Koruma Politikasını ve MQL5.com Kullanım Şartlarını kabul edersiniz
Hesabınız yoksa, lütfen kaydolun
Onlar. Yatağın altına yuvarlanan 10 senti bulmak için 100 dolarlık banknotu ateşe vermeye hazır mısınız?
Bir madeni para olabilir veya olmayabilir.
Onlarca ihtimal iki katıdır. Ve en önemlisi, get_rand()'ın maliyeti hakkındaki iddialar havada uçuştu, öyleyse neden normal olarak yapabiliyorken (tekdüze bir dağılım beklerken) değişen bir olasılıkla anüsten rasgele sayılar alıyorsunuz? 100 dolarlık bir banknotu biriktirmiyorsunuz, ancak eşleşiyor.
Bir madeni para olabilir veya olmayabilir.
Onlarca ihtimal iki katıdır. Ve en önemlisi, get_rand()'ın maliyeti hakkındaki iddialar havada uçuştu, öyleyse neden normal olarak yapabiliyorken (tekdüze bir dağılım beklerken) değişen bir olasılıkla anüsten rasgele sayılar alıyorsunuz? 100 dolarlık bir banknotu biriktirmiyorsunuz, ancak eşleşiyor.
Evet, işlevinizin güçlü yavaşlığı konusunda yanılmışım. Algoritmayı yanlış anladım. Soryan.
Ama yine de, algoritmam, sizinki gibi daha evrensel ve 32767 sayısı ile sınırlı olmamasına rağmen, önerilenlerin en hızlısı olduğu ortaya çıktı.
Kanıt kodu.
Bu komut dosyası, rastgele bir renk ve rastgele koordinatlara sahip bir dizi noktayı rastgele oluşturur. Dizi boyutu, grafik grafiğindeki piksel sayısına eşittir. Bu 5 kez tekrarlanır
Rakamlar, rand()% 20000 kullandığımızda sorunun özünü gösterecek şekilde seçilmiştir.
olmalı:
Tehdit, ancak vakaların %99,9'unda bu işlev de çalışacaktır: daha da hızlı çalışacaktır.bu fonksiyon 0 ile 1073741824 arasında rastgele bir sayı üretecektir. bu sayı tüm geçmişteki herhangi bir enstrüman için tik sayısından bile daha fazladır. Böyle bir işlevin "sahtekarlığı", görevlerin %99,9'u için mikroskobik olacaktır.
Ama yine de, algoritmam, sizinki gibi daha evrensel olmasına ve 32767 sayısıyla sınırlı olmamasına rağmen, önerilenlerin en hızlısı olduğu ortaya çıktı.
Kanıt kodu.
Sıkı çalışma için teşekkürler, gerçekten ilginç sonuçlar. Rand() işlevinin o kadar hızlı olduğu ortaya çıktı ki, aritmetik işlemlerden daha hızlı çalışıyor.
Sıkı çalışma için teşekkürler, gerçekten ilginç sonuçlar. Rand() işlevinin o kadar hızlı olduğu ortaya çıktı ki, aritmetik işlemlerden daha hızlı çalışıyor.
hayır, daha hızlı değil. Yaklaşık bir nanosaniye, tıpkı bir çiftin karekökünü almak gibi. +-*/ işlemler bir nanosaniyenin kesirlerinde gerçekleştirilir.
Ancak karekök gibi, Rand() modern işlemcilerde yazılımda değil, donanım düzeyinde yapılır.
hayır, daha hızlı değil. Yaklaşık bir nanosaniye, tıpkı bir çiftin karekökünü almak gibi. +-*/ işlemler bir nanosaniyenin kesirlerinde gerçekleştirilir.
Ancak karekök gibi, Rand() modern işlemcilerde yazılımda değil, donanım düzeyinde yapılır.
Evet ise neden olmasın. Sürümünüz benimkinden farklıdır, çünkü her zaman 5 Rand() ve benimki: 20000 aralığında ortalama 1.64 kez ve 256 aralığında 1 kez. Toplamda, Rand() her yineleme için 25 kez çağrılır. , ve bende 1,64*2+3 = 5,3 kez var. Genel olarak, elbette, garip bir durum, sebebinin tam olarak ne olduğunu bulmak gerekiyor. Ayrıca orada ek olarak bir sürü bit işleminiz var ...
1. Peki, fonksiyonlarınızda sorunun çözülmediğini, sadece gizlendiğini anlıyoruz, kilo vermeyeceğim, ancak kemeri daha sıkı sıkın.
2. Alexey ile olan seçeneklerimizde bu en kötü seçenektir, diğer birçok durumda hız neredeyse rand() düzeyinde olacaktır, ancak sabit zamanınız var.
3. Rand()'ın neden bu kadar dar bir aralıkta sayılar ürettiğini hiç merak ettiniz mi? Bu sözde rasgele bir üreteçtir, yani periyodiktir, bu nedenle gerekmediği yerde bir grup rasgele sayı üretir ve sonra onları atar, kalitesi kötüleşir (tekrarlar daha erken olur).
4. Bazıları rastgele verileri daha karmaşık bir şekilde alır. Mesela ben ağdan çektim, birileri bile satın alabilir. Bu yüzden, daha sonra aptalca atmak için zorlukla elde edilen verileri boşa harcamam gerekiyor (ulong oluşturmak, doğru algoritmayı yazmak - bu bizim yolumuz değil)?
Evet ise neden olmasın. Sürümünüz benimkinden farklıdır, çünkü her zaman 5 Rand() ve benimki: 20000 aralığında ortalama 1.64 kez ve 256 aralığında 1 kez. Toplamda, Rand() her yineleme için 25 kez çağrılır. , ve bende 1,64*2+3 = 5,3 kez var. Genel olarak, elbette, garip bir durum, sebebinin tam olarak ne olduğunu bulmak gerekiyor. Çünkü ek olarak gerçekleştirilen bir sürü bit işleminiz de var ...
bitsel en ucuz işlemlerdir. Neredeyse ücretsiz.
Ama genel olarak katılıyorum. Nedenini ben de anlamıyorum ... Belki de optimizasyonun mucizeleri. Yine de ne geliştirilebilir ...
bitsel en ucuz işlemlerdir. Neredeyse ücretsiz.
Ama genel olarak katılıyorum. Nedenini ben de anlamıyorum ... Belki de optimizasyonun mucizeleri. Yine de ne geliştirilebilir ...
1. Peki, fonksiyonlarınızda sorunun çözülmediğini, sadece gizlendiğini anlıyoruz, kilo vermeyeceğim, ancak kemeri daha sıkı sıkın.
2. Alexey ile olan seçeneklerimizde bu en kötü seçenektir, diğer birçok durumda hız neredeyse rand() düzeyinde olacaktır, ancak sabit zamanınız var.
3. Rand()'ın neden bu kadar dar bir aralıkta sayılar ürettiğini hiç merak ettiniz mi? Bu sözde rasgele bir üreteçtir, yani periyodiktir, bu nedenle gerekmediği yerde bir grup rasgele sayı üretir ve sonra onları atar, kalitesi kötüleşir (tekrarlar daha erken olur).
4. Bazıları rastgele verileri daha karmaşık bir şekilde alır. Mesela ben ağdan çektim, birileri bile satın alabilir. Bu yüzden, daha sonra aptalca atmak için zorlukla elde edilen verileri boşa harcamam gerekiyor (ulong oluşturmak, doğru algoritmayı yazmak - bu bizim yolumuz değil)?
Bu zaten sıkıcı.
Bu sorunun %0,1 oranında bile fark edilebildiği bir durumu yeniden oluşturmak için aşağıdaki değerlerin üzerindeki aralıklarda çalışmanız gerekir:
Hiç böyle aralıklar kullandınız mı? O zaman neden bu kontrolleri ve döngüleri koydunuz?
İyinin düşmanı en iyisi.
Şahsen benim rasgele sayı üretme aralıklarım pratikte 2000, maksimum 4000 ile sınırlı. Rand() bunun için oldukça iyi çalışıyor.
Bunu koduma yapıştırın:
ve Rand() işlevinin "sahtekarlığını" fark etmeyeceksiniz (Rand()%20000 varyantında olduğu gibi) ve noktalar görsel olarak eşit aralıklarla yerleştirilecektir, bu nedenle oldukça çalışır ve en hızlısıdır.
Tehdit İşlemci geliştiricilerinin Rand() öğesini 2 ^ 15 = 32768 değeriyle sınırlaması boşuna değildir. Onlar aptal insanlar değil. Bu, pratik görevlerin %99'unu tamamen kapsar.
Ve "çirkin" fikirleri sevenler için seçenek fazlasıyla yeterli:
Şahsen benim rasgele sayı üretme aralıklarım pratikte 2000, maksimum 4000 ile sınırlı. Rand() bunun için oldukça iyi çalışıyor.
Bunu koduma yapıştırın:
ve Rand() işlevinin "sahtekarlığını" fark etmeyeceksiniz (Rand()%20000 varyantında olduğu gibi) ve noktalar görsel olarak eşit aralıklarla yerleştirilecektir, bu nedenle oldukça çalışır ve en hızlısıdır.
tadını çıkar, umurumda değil. Özellikle % öğesinin sağında RAND_MAX+1'in (256 veya 1024) katı olduğunda.
Ve "çirkin" fikirleri sevenler için seçenek fazlasıyla yeterli:
İşlemci geliştiricilerinin nesi var? Jeneratör - yazılım uygulandı. Tek gereksinim RAND_MAX >= 32767 ve en az 2^32 noktadır. Yani mikrolitrelerde "minimum" da çok yetersiz bir jeneratör var.
Ve en ileri görüşlüler kendilerini dürüst bir rand () yapacaktır (çokluk yoksa), bu referans kitaplarında bile tavsiye edilir.