[英]What is this algorithm for generating random numbers called?
我已經反向設計了跟隨算法來生成隨機數;
int __cdecl sub_40BB60()
{
char v0; // si@1
int v1; // edx@1
int v2; // ecx@1
unsigned int v3; // eax@1
int v4; // edi@1
int v5; // esi@1
int result; // eax@1
v0 = random_state;
v1 = dword_685440[((_BYTE)random_state - 3) & 0xF];
v2 = dword_685440[random_state] ^ v1 ^ ((v1 ^ 2 * dword_685440[random_state]) << 15);
v3 = ((unsigned int)dword_685440[((_BYTE)random_state - 7) & 0xF] >> 11) ^ dword_685440[((_BYTE)random_state - 7) & 0xF];
v4 = v3 ^ dword_685440[random_state] ^ v1 ^ ((v1 ^ 2 * dword_685440[random_state]) << 15);
dword_685440[random_state] = v4;
v5 = (v0 - 1) & 0xF;
result = dword_685440[v5] ^ v2 ^ v4 ^ 32 * (v4 & 0xFED22169) ^ 4 * (dword_685440[v5] ^ ((v2 ^ (v3 << 10)) << 16));
random_state = v5;
dword_685440[v5] = result;
return result;
}
dword_685440
是一個int[16]
,並且random_state
會突變,如您所見。
我以為它可能是一個扭轉者。 有誰認識這個算法?
看起來它可能是線性反饋移位寄存器算法。 這些可以通過位移和XOR運算的組合在字級實現,這似乎是最重要的。
我之前也反過來設計過這段代碼,並認為它可以作為其他人的參考。
這是WELL512隨機數發生器。 這是一個實現: https : //github.com/masfj/RNG/blob/master/WELLRNG512.cpp
如果您正在搜索常量0xFED22169,則在WELL-512中找不到它。 它的常量是0xDA442D20。 代碼本身已由編譯器進行代數優化。
我最初反編譯了相同的代碼:
DWORD a = g_state[g_stateIdx];
DWORD b = g_state[(g_stateIdx - 3) % 16];
DWORD c = a ^ b ^ ((b ^ 2 * a) << 15);
DWORD d = (g_state[(g_stateIdx - 7) & 0xF] >> 11) ^ g_state[(g_stateIdx - 7) & 0xF] ^ c;
DWORD e = d ^ c;
g_state[g_stateIdx] = e;
DWORD f = e ^ 0x20 * (e & 0xFED22169);
g_stateIdx = (g_stateIdx - 1) % 16;
DWORD g = g_state[g_stateIdx];
DWORD h = f ^ 4 * (g ^ ((c ^ (d << 10)) << 16));
g_state[g_stateIdx] = g ^ c ^ h;
return g_state[g_stateIdx];
這段代碼在這里:
DWORD f = e ^ 0x20 * (e & 0xFED22169);
是相同的:
d = a ^ ((a << 5) & 0xda442d20UL);
其中WELL512常量為0xda442d2d0。
((signed)0xda442d24 >> 5) == 0xfed2169
0x20 == 1 << 5
從內存中,在線編譯其中一個WELL512源代碼,在VS2013或VS2015下生成完全相同的代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.