- 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 */
}
Fai 24.06.2012 19:02 # 0
bormand 24.06.2012 19:04 # +4
Магические числа такие магические.
carsten 25.06.2012 12:01 # 0
bormand 24.06.2012 19:06 # +1
UPD: Да. Он самый.
http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt64.html
UPD2: Ну нормальный код, оптимизированный на скорость, а не на понятность...
Fai 24.06.2012 19:16 # −1
2. Сделай ясно.
3. Сделай понятно.
4-1000. Дорабатывай и расширяй.
1001. Прогони по профилировщику.
1002. Ускоряй слабые места.
К слову говно не только в том что структура слабовата, но и в выборе имён переменных: mt, NN, i, j, k.
Или скорость работы уже от размера имён переменных зависит?
bormand 24.06.2012 19:38 # 0
Fai 24.06.2012 19:53 # 0
bormand 24.06.2012 20:30 # 0
Цикл до max(длина_ключа, длина_вектора_состояния), смешивающий ключ с вектором состояния. i - позиция в векторе состояния, j - позиция в ключе. Обе переменных сбрасываются при переполнениях.
Затем еще один пробег по всем элементам, который начинается с того места, на котором остановились в предыдущем цикле.
Если этот код переписать с говорящими именами - ничего не изменится - т.к. ход работы виден и без них, а суть формул и констант они все равно не раскроют.
Fai 24.06.2012 22:18 # 0
carsten 25.06.2012 11:58 # 0
bormand 25.06.2012 14:51 # +1
Плохо поступил тот, кто спер пару функций из либы, и оставил их без контекста и без комментария о том что это и откуда оно взято. Вполне можно было поместить исходники либы (там ашка да сяшка) в ее оригинальном виде в каталог типа 3rdparty/mt64.
Fai 25.06.2012 16:29 # 0
bormand 25.06.2012 17:36 # 0
carsten 25.06.2012 20:53 # 0
Ну тогда init_with_mt64. А ещё лучше init_with_mersenne_twister_64bit :D
bormand 26.06.2012 05:15 # 0
mt64_init_with_array(..)
А вообще class MersenneTwister, раз уж ОП запостил это в раздел с++ :)
defecate-plusplus 26.06.2012 07:58 # +3
bormand 26.06.2012 08:57 # 0
Oh shi... Ну зато можно добавить свои параметры МТ, если стандартные mt19937 и mt11213b по какой-то причине не доставляют.
eth0 24.06.2012 21:26 # +1
bormand 24.06.2012 21:35 # 0
sayidandrtfm 25.06.2012 10:19 # 0
HaskellGovno 26.06.2012 08:53 # 0