- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
void init_by_array64(unsigned long long init_key[],
unsigned long long key_length)
{
unsigned long long i, j, k;
init_genrand64(19650218ULL);
i=1; j=0;
k = (NN>key_length ? NN : key_length);
for (; k; k--) {
mt[i] = (mt[i] ^ ((mt[i-1] ^ (mt[i-1] >> 62)) * 3935559000370003845ULL))
+ init_key[j] + j; /* non linear */
i++; j++;
if (i>=NN) { mt[0] = mt[NN-1]; i=1; }
if (j>=key_length) j=0;
}
for (k=NN-1; k; k--) {
mt[i] = (mt[i] ^ ((mt[i-1] ^ (mt[i-1] >> 62)) * 2862933555777941757ULL))
- i; /* non linear */
i++;
if (i>=NN) { mt[0] = mt[NN-1]; i=1; }
}
mt[0] = 1ULL << 63; /* MSB is 1; assuring non-zero initial array */
}
Магические числа такие магические.
UPD: Да. Он самый.
http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt64.html
UPD2: Ну нормальный код, оптимизированный на скорость, а не на понятность...
2. Сделай ясно.
3. Сделай понятно.
4-1000. Дорабатывай и расширяй.
1001. Прогони по профилировщику.
1002. Ускоряй слабые места.
К слову говно не только в том что структура слабовата, но и в выборе имён переменных: mt, NN, i, j, k.
Или скорость работы уже от размера имён переменных зависит?
Цикл до max(длина_ключа, длина_вектора_состояния), смешивающий ключ с вектором состояния. i - позиция в векторе состояния, j - позиция в ключе. Обе переменных сбрасываются при переполнениях.
Затем еще один пробег по всем элементам, который начинается с того места, на котором остановились в предыдущем цикле.
Если этот код переписать с говорящими именами - ничего не изменится - т.к. ход работы виден и без них, а суть формул и констант они все равно не раскроют.
Плохо поступил тот, кто спер пару функций из либы, и оставил их без контекста и без комментария о том что это и откуда оно взято. Вполне можно было поместить исходники либы (там ашка да сяшка) в ее оригинальном виде в каталог типа 3rdparty/mt64.
Ну тогда init_with_mt64. А ещё лучше init_with_mersenne_twister_64bit :D
mt64_init_with_array(..)
А вообще class MersenneTwister, раз уж ОП запостил это в раздел с++ :)
Oh shi... Ну зато можно добавить свои параметры МТ, если стандартные mt19937 и mt11213b по какой-то причине не доставляют.