Нашел хороший быстрый и простой алгоритм, о котором говорил ранее
Code:
//Marsaglia's MWC (multiply with carry) algorithm
static uint32_t m_z = 333, m_w = 888; // any seeds not null
uint32_t GetUint()
{
m_z = 36969 * (m_z & 65535) + (m_z >> 16);
m_w = 18000 * (m_w & 65535) + (m_w >> 16);
return (m_z << 16) + m_w;
}
double GetUniform()
{
// 0 <= u < 2^32
uint32_t u = GetUint();
// The magic number below is 1/(2^32 + 2).
// The result is strictly between 0 and 1.
return (u + 1.0) * 2.328306435454494e-10;
}
скомпилированная в ассемблер целочисленная
Code:
GetUint:
mov eax, DWORD PTR m_z
movzx edx, ax
imul edx, edx, 36969
shr eax, 16
add eax, edx
mov DWORD PTR m_z, eax
mov edx, DWORD PTR m_w
movzx ecx, dx
imul ecx, ecx, 18000
shr edx, 16
add edx, ecx
mov DWORD PTR m_w, edx
sal eax, 16
add eax, edx
ret
m_w:
.long 888
m_z:
.long 333