Другие языки программирования и технологии

народ поделись кодом на асме которым С++ считает функцию random()

я так думаю не так сложно его нарыть в недрах библиотек я б сам нашел но Visual Studiя на мой под завязку набитый HDD уже не влезет
Андрей Обухов
Андрей Обухов
59 824
АН
Адлет Нуркабланов
7 027
Лучший ответ
Андрей Обухов а как распечатать на экране дробное число?
Кнут говорил, что для сжатия диапазона чисел нужно не делить, а умножать

на С++ (линейный конгруэнтный метод)

template<dword>
class CRandom
{
public:
CRandom(DWORD dwSeed = 0)
: m_dwRand(dwSeed)
{
}

DWORD Seed(DWORD dwSeed)
{
m_dwRand = dwSeed;
}

bool Bit()
{
m_dwRand = A * m_dwRand + C;
return m_nRand < 0;
}

BYTE Byte()
{
m_dwRand = A * m_dwRand + C;
return m_bRand[3];
}

WORD Word()
{
m_dwRand = A * m_dwRand + C;
return m_wRand[1];
}

DWORD Dword()
{
return m_dwRand = A * m_dwRand + C;
}

DWORD Dword(DWORD dwMax)
{
QWORD Ret;
Ret.qwQuadPart = m_dwRand = A * m_dwRand + C;
Ret.qwQuadPart *= dwMax;
return Ret.dwLHighPart;
}

double Double()
{
m_dwRand = A * m_dwRand + C;
return m_wRand / 4294967296.0;
}

protected:
union QWORD
{
UINT64 qwQuadPart;
struct
{
DWORD dwLowPart;
DWORD dwLHighPart;
};
};

union
{
DWORD m_dwRand;
LONG m_nRand;
WORD m_wRand[2];
BYTE m_bRand[4];
};
};

int main()
{
CRandom<0x6C078965, 0x15ADCA47> rnd;

bool a = rnd.Bit();
BYTE b = rnd.Byte();
WORD c = rnd.Word();
DWORD d = rnd.Dword();
double e = rnd.Double();
}

На asm

.486
.model flat, stdcall

.data

g_dwRand dd 0

.code

Rand PROC dwMax:DWORD
mov eax, 6C078965h
mul dword ptr g_dwRand
add eax, 15ADCA47h
mov g_dwRand, eax
mul dword ptr dwMax
mov eax, edx
ret
Rand ENDP

END
ТЧ
Тамик Ч,е
21 360
int __cdecl rand ( void )
{
_ptiddata ptd = _getptd();
return( ((ptd->_holdrand = ptd->_holdrand * 214013L
+ 2531011L) >> 16) & 0x7fff );
}
Ivan Ivanov
Ivan Ivanov
3 721
Андрей Обухов надо на асме +)
Тамик Ч,е Кнут говорил, что для сжатия диапазона чисел нужно не делить и брать остаток, а умножать.

На С++

template<dword>
class CRandom
{
public:
  CRandom(DWORD dwSeed = 0)
    : m_dwRand(dwSeed)
  {
  }

  DWORD Seed(DWORD dwSeed)
  {
    m_dwRand = dwSeed;
  }

  bool Bit()
  {
    m_dwRand = A * m_dwRand + C;
    return m_nRand < 0;
  }

  BYTE Byte()
  {
    m_dwRand = A * m_dwRand + C;
    return m_bRand[3];
  }

  WORD Word()
  {
    m_dwRand = A * m_dwRand + C;
    return m_wRand[1];
  }

  DWORD Dword()
  {
    return m_dwRand = A * m_dwRand + C;
  }
Адлет Нуркабланов вот с дробными числами
http://pastebin.com/HM4ugMvh
script src="/js/common.js?119"></script>
<script></script>
<link>
<link>
<link>
<script></script>
<script></script>
<script></script><script></script>

<link>

<script></script>
Андрей Обухов чето на асм уже не похоже ...