ushort rand16() { return(((ushort)rand8()<<8)|(ushort)rand8());}
uchar rand8()
{
staticushort s[10] = { 0x52, 0x8e, 0xdc, 0x61, 0x35, 0xbc, 0x5c, 0xb6 };
staticushort c = 0xa6;
staticint i = 0;
ushort t;
uchar x;
x = (uchar)s[i];
t = (ushort)x + c;
c = t >> 8;
c += x;
x = (uchar)t & 255;
s[i] = x;
i++;
i=i&7;
return x;
}
つまり、2ナノ秒以下です。
2019.06.0923:52:15.855 TestSpeedRand (US30Index,H1) Время формирования случайных массивов = 9068 микросекунд. Всего сгенерировано 4655770 случайных чисел rand()
2019.06.0923:52:17.892 TestSpeedRand (US30Index,H1) Время формирования случайных массивов = 16562 микросекунд. Всего сгенерировано 4655770 случайных чисел rand16()2019.06.0923:52:19.940 TestSpeedRand (US30Index,H1) Время формирования случайных массивов = 22299 микросекунд. Всего сгенерировано 4655770 случайных чисел get_rand()
2019.06.0923:52:21.986 TestSpeedRand (US30Index,H1) Время формирования случайных массивов = 20094 микросекунд. Всего сгенерировано 4655770 случайных чисел randUlong()
2019.06.0923:52:24.020 TestSpeedRand (US30Index,H1) Время формирования случайных массивов = 14660 микросекунд. Всего сгенерировано 4655770 случайных чисел randUint()
2019.06.0923:52:26.053 TestSpeedRand (US30Index,H1) Время формирования случайных массивов = 12543 микросекунд. Всего сгенерировано 4655770 случайных чисел randShort()
2019.06.0923:52:28.095 TestSpeedRand (US30Index,H1) Время формирования случайных массивов = 20883 микросекунд. Всего сгенерировано 4655770 случайных чисел RandomLong()
// Некоторые возможности структур, которых нет у классов.// #define struct class // Смотрим ошибки, которые возникают при замене структур на классы.struct A
{
public:
int i;
uint Save( constint handle) { return(FileWriteStruct(handle, this)); } // Запись себяuint Load( constint handle) { return(FileReadStruct(handle, this)); } // Чтение себя
};
// Использование в объединенияхunion UNION
{
uchar b1[sizeof(A)];
A b2;
};
// Выравниваниеstruct pack(sizeof(A)) B : public A
{
short j;
};
// Структура со скрытым полемstruct C : private A
{
public:
void Set( constint Num ) { this.i = Num; }
int Get( void ) const { return(this.i); }
};
// Структура с неизменяемым полем.struct D
{
public:
const A a;
};
template <typename T1, typename T2>
void FromTo( const T1 &ValueFrom, T2 &ValueTo )
{
uchar Bytes[];
StructToCharArray(ValueFrom, Bytes); // В массив байтовCharArrayToStruct(ValueTo, Bytes); // Из массива байтов
}
voidOnStart()
{
A a[1] = {0};
FileReadArray(0, a); // Чтение массиваFileWriteArray(0, a); // Запись массиваArrayCopy(a, a); // Копирование массивовZeroMemory(a); // Обнуление массивов
C c; // Структура со скрытым полем
c.Set(7);
FromTo(c, a[0]);
Print(a[0].i); // Достали значение приватного поля из C.
D d; // Структура с неизменяемым полем.
a[0].i = 5;
FromTo(a[0], d);
Print(d.a.i); // Изменили const-поле.
FromTo(a[0], c);
Print(c.Get()); // Изменили private-поле.
}
コンパイル時にすべての値が計算されるため、算術演算の 問題ではないようです。 原因は、反復回数が不明なループの存在です(反復回数は平均2回以下ですが)。 つまり、あなたのコードは、既知の数のrand()呼び出しによって何らかの最適化がなされているのです。
https://www.mql5.com/ru/forum/308881/page3#comment_11222192
プロセッサーの開発者は何のためにいるのですか?ジェネレーターはソフトウェアで実装されています。
いいえ、そんなことはありません。このジェネレーターはハードウェアで実装されています。この速さはソフトウェアでは実現できない、当たり前のことですが。
いいえ、もちろんそんなことはありません。このジェネレーターはハードウェアで実装されています。この速さはソフトウェアでは実現できない、当たり前のことなのです。
実は、ハードウェアにはRAND()ジェネレータが実装されていますが、rand()は疑似ランダムなものです。
マスランド
0〜32767の範囲の擬似乱数を 返します。
まあ、実際には、ハードウェアはRAND()ジェネレータを実装していますが、rand()は疑似ランダムなもので、ハンドブックに書いてある通りです
ハードウェアの方はあまり詳しくないのですが、おそらくがっかりされるでしょう。あまり高速に動作しないようで、擬似乱数の種としてしか使えません。明らかに - 擬似的な
ランダムはもっと遅い(https://en.wikipedia.org/wiki/RdRand)
明らかに擬似的。
ランダム実行の速度が大幅に低下(https://en.wikipedia.org/wiki/RdRand)
まあ、そうですね、擬似も突っ込まれますね。しかし、私は確信している - rand()は、プログラム的に実装されています。もしかしたら、通りすがりの「先輩」同志が確認してくれるかもしれない。
まあ、そうなんですが、擬似も入れてるんですよ。しかし、私は確信している - rand()は、プログラム的に実装されています。もしかしたら、通りすがりの「先輩」同志が確認してくれるかもしれない。
しかし、私は確信している - rand()は、プログラム的に実装されています。もしかしたら、通りすがりの「先輩」同志が確認してくれるかもしれない。
はい、おそらくその通りだと思います。
この乱数生成関数rand16()の変形版は、オリジナル関数に比べて半分以下の速度で動作し、0から65535までの乱数を生成します。
つまり、2ナノ秒以下です。
また、クラスオブジェクトは、類似のPOD構造のオブジェクトよりも16バイト大きくなります。そのため、構造体のアレイ化はさらに経済的である。
トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム
Symbol()と_Symbolの違いは何ですか?
fxsaber, 2019.07.07 14:47
Symbol()がクラス/構造体の内部で :: なしで呼び出された場合、同じ名前のメソッドを宣言すればすぐに代入できるので、定義済み変数より便利かもしれません。