这种用于生成随机数的算法是什么?

kva*_*nck 5 random algorithm reverse-engineering

我已经反向设计了跟随算法来生成随机数;

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;
}
Run Code Online (Sandbox Code Playgroud)

dword_685440是一个int[16],并且random_state你可以看到变异.

我以为它可能是一个扭转者.有谁认识这个算法?

pjs*_*pjs 2

看起来它可能是线性反馈移位寄存器算法。这些可以通过位移位和异或运算的组合在字级实现,这似乎就是这样做的。