mql5言語の特徴、微妙なニュアンスとテクニック - ページ 135

 
Vict:

思いやりがあるんですね、ありがとうございます。間違えました、括弧を付けなかったので、「不当」機能を使ったはずです。

ZS:元記事に修正を加えました。

なぜこの構成が些細なrand()%maxより優れているのか説明してください。

ZS: なるほど、そういうことですね。
では、max>32767の場合はどうでしょうか?この関数はuint 型 ですが、rand() と同じ最大値、つまり 32767 を生成します。

のようなものを使うのがよいでしょう。

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

思いやりがあるんですね、ありがとうございます。間違えて、括弧を付けなかったので、"unfair "機能を使用します。

ZS:元記事に修正を加えました。

誰かがあなたの正直な関数を使おうとして get_rand(10) と書くと、rand()%10 より 3276 倍も遅く動作することに気づきますか?

 
Nikolai Semko:

では、max>32767の場合はどうでしょうか?結局のところ、あなたの関数はuint 型 ですが、rand() が生成する最大値、つまり 32767 を生成します。

のようなものを使用したほうがよいでしょう。

また、MathRand()はintを返しますが、もし誰かがそこから0が6つある数字を期待したらどうでしょうか?ある程度の公開をあてにすること。ここで、あなた自身が>32767を取得する方法を知っている。

彼らはよく考えずにrand()%3と書き、その後私のメッセージを見て確率が変わることを理解するのです。

誰かがあなたの正直な関数を使おうとして get_rand(10) と書くと、rand()%10 より 3276 倍も遅く動作することに気づきますか?

そうですね、非常に遅いです。100万コールのサイクルでは、コールバックが約300回発生します。get_rand()がもたもたするような素のfor()で構成されたプログラムなら、それはそれでクリティカルだと思うのですが、どうでしょう?

そして、osスケジューラがrand()と不釣り合いに多くのCPU時間を占有して実行速度を低下させていることに気づいていますか?そんなに急いでいるのなら、何らかのドスが必要です。

 
Vict:

また、MathRand()はintを返しますが、もし誰かがそこから6つのゼロを含む数字を期待したらどうでしょうか?ある程度の公開を期待しています。ここで、あなた自身が>32767を取得する方法を知っている。

彼らはよく考えずにrand()%3と書き、その後私のメッセージを見て確率の変化に気づくのです。

そうですね、非常に遅いです。100万コールのサイクルでは、コールバックが約300回発生します。get_rand()がもたもたするような素のfor()で構成されたプログラムなら、それはそれでクリティカルだと思うのですが、どうでしょう?

そして、osスケジューラが多くのCPU時間を占め、rand()とは無関係に実行速度を低下させていることに気づいていますか?そんなに急いでいるのなら、何らかのドスが必要です。

最適化において、関数のスピードは非常に重要です。しかも、スケジューラやDOSの話ではない。
 
Vict:

また、MathRand()はintを返しますが、もし誰かがそこから6つのゼロを含む数字を期待したらどうでしょうか?ある程度の公開を期待しています。ここで、あなた自身が>32767を取得する方法を知っている。

彼らは何も考えずにrand()%3と書き、私のメッセージを見て、確率が変わることに気づくことが多いのです。

そうですね、非常に遅いです。100万コールのサイクルでは、コールバックが約300回発生します。get_rand()がもたもたするような素のfor()で構成されたプログラムなら、それはそれでクリティカルだと思うのですが、どうでしょう?

そして、osスケジューラがrand()と不釣り合いに多くのCPU時間を占有して実行速度を低下させていることに気づいていますか?そんなに急いでいるのなら、何らかのドスが必要です。

自分の間違いを認めることを恐れないでください。何も怖いこと、屈辱的なことはありません。人は誰でも失敗をするものです。それが普通です。
そうだ、私は間違っていた」と言う方が、コミュニティの認識という点ではずっと簡単で有益なのです。ありがとうございました"言い訳をするのではなく

これは、より速く、よりフレキシブルに機能します。

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;
  }

大きな数字が必要でなければ、ulongからuintに再コード化すると高速化できるかもしれません(5ではなく3のrand()が必要です)。

 
Nikolai Semko:

自分の間違いを認めることを恐れないでください。何も怖いこと、屈辱的なことではありません。人は誰でも失敗をするものです。大丈夫です。
そうだ、私が間違っていた」と言う方が簡単だし、コミュニティの役に立ちます。ありがとうございました"自分を正当化しようとするのではなく

結局のところ、このオプションはより速く、より普遍的に機能します。

また、大きな数字を必要としない場合は、ulongからuintに再コード化することで高速化することができます(5ではなく3のrand()))。

では、自分の実装の不公平さに戸惑うことはないのですね(ちなみに速度面では、もっと遅くなります)。お好きなようにどうぞ。

Zy:不誠実 - 異なる確率で異なる範囲の数字を生成すること。
 
Vict:

では、自分の実装の不公平さに戸惑うことはないのでしょうか(ちなみに速度的にはかなり遅くなります)。お好きなようにどうぞ。

Zy:不正は、異なる確率で異なる範囲の数字を発生させることです。
本気ですか?
 
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++.
 
ベッドの下に転がった10セント硬貨を探すために100ドル札に火をつけるのか?
 
Nikolai Semko:
ベッドの下に転がった10セント硬貨を探すために100ドル札に火をつけるのか?

確率の役割を過小評価してはいけません。 数千万回の反復では、これらの「転がった小銭」はかなり具体的な数字を犠牲にします。 さらに、あなたのコードは小さな範囲では明らかに不合理です(常にrand()を5回呼び出すことはまさに「ノートを燃やす」ことになります)。

半年前、この話題はすでにフォーラムで議論され、私はこのオプションを提案しました。

トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム

N深さの乱数を得るには?

アレクセイ ナボイコフ さん 2018.12.31 01:25

前回のコードが間違っていることが判明しました。桁数が多くて大変でしたが、ここでは右のような変型で、より簡潔な表現になっています。

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) return0;  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
}