Другие языки программирования и технологии
народ поделись кодом на асме которым С++ считает функцию random()
я так думаю не так сложно его нарыть в недрах библиотек я б сам нашел но Visual Studiя на мой под завязку набитый HDD уже не влезет
Андрей Обухов
а как распечатать на экране дробное число?
Кнут говорил, что для сжатия диапазона чисел нужно не делить, а умножать
на С++ (линейный конгруэнтный метод)
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
на С++ (линейный конгруэнтный метод)
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
int __cdecl rand ( void )
{
_ptiddata ptd = _getptd();
return( ((ptd->_holdrand = ptd->_holdrand * 214013L
+ 2531011L) >> 16) & 0x7fff );
}
{
_ptiddata ptd = _getptd();
return( ((ptd->_holdrand = ptd->_holdrand * 214013L
+ 2531011L) >> 16) & 0x7fff );
}
Андрей Обухов
надо на асме +)
Тамик Ч,е
Кнут говорил, что для сжатия диапазона чисел нужно не делить и брать остаток, а умножать.
На С++
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;
}
На С++
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
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>
<script></script>
<link>
<link>
<link>
<script></script>
<script></script>
<script></script><script></script>
<link>
<script></script>
Андрей Обухов
чето на асм уже не похоже ...
Похожие вопросы
- В различных языках есть ГСЧ, всегда записывается как функция "random", а какой её внутренний код?
- Задача по C++ Не могу придумать как одновременно записывать в массив и считать функцию.
- Помогите пожалуйста переделать сей код под указатели и потом под функцию C++
- Как преобразуется обычная прога на си, где надо вывести слово на экран в маш.код и что процессор там считает?
- В какой ситуации программист обязан оставить программный код организации в которой он работает?
- народ подскажите название проги, в которую можно вложить фотку и подобрать себе прическу?
- Как сделать программу в pascalABC которая бы считала количество определённых слов в тексте?
- Напишите программу которая будет считать значения целых переменных
- Как сделать Random в C#
- Проблема с оператором random в паскале