[*] IM NOT MAD. YOURE MAD (b88c61c1 cont)

This commit is contained in:
Reece Wilson 2023-11-18 01:45:12 +00:00
parent 63b72a9fb5
commit 37adbad397

View File

@ -72,6 +72,13 @@ namespace Aurora::RNG
return ret; return ret;
} }
static AuUInt64 RngConvertBounds(AuUInt32 i)
{
AuUInt8 ret;
AuBitScanReverse(ret, i);
return 1ull << (ret + 1);
}
void RandomDevice::NextString(char *pString, AuUInt32 uLength, ERngStringCharacters type) void RandomDevice::NextString(char *pString, AuUInt32 uLength, ERngStringCharacters type)
{ {
static AuPair<const char *, int> rngSequence[static_cast<int>(ERngStringCharacters::eEnumCount)] = static AuPair<const char *, int> rngSequence[static_cast<int>(ERngStringCharacters::eEnumCount)] =
@ -81,7 +88,7 @@ namespace Aurora::RNG
{"ABCDEFGHIJKLMNOPQRSTUVWXYZ", 26}, {"ABCDEFGHIJKLMNOPQRSTUVWXYZ", 26},
{"1234567890", 10}, {"1234567890", 10},
{"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890", 62}, {"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890", 62},
{"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890=-+!!$%^*.[];:", 76} {"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890=-+!$%^*.[];:", 75}
}; };
if (!pString) if (!pString)
@ -102,7 +109,14 @@ namespace Aurora::RNG
for (auto i = 0u; i < uLength; i++) for (auto i = 0u; i < uLength; i++)
{ {
pString[i] = pair.first[reinterpret_cast<const AuUInt8 *>(pString)[i] % static_cast<int>(pair.second)]; auto uUpperBound = RngConvertBounds(pair.second);
AuUInt8 uNext {};
auto uWord = reinterpret_cast<const AuUInt8 *>(pString)[i];
while ((uNext = (uWord & (uUpperBound - 1))) >= pair.second)
{
uWord = AuFnv1a32Runtime(&uWord, sizeof(uWord));
}
pString[i] = pair.first[uNext];
} }
} }
@ -170,11 +184,11 @@ namespace Aurora::RNG
#else #else
auto uRange = uMax - uMin; auto uRange = uMax - uMin;
auto uMassiveWord = NextU32(); auto uMassiveWord = NextU32();
auto uUpperBound = AuPageRoundUp<AuUInt32>(uRange, 2); auto uUpperBound = RngConvertBounds(uRange + 1);
AuUInt32 uNext {}; AuUInt32 uNext {};
while ((uNext = (uMassiveWord & (uUpperBound - 1))) > uRange) while ((uNext = (uMassiveWord & (uUpperBound - 1))) > uRange)
{ {
uMassiveWord = NextU32(); uMassiveWord = AuFnv1a32Runtime(&uMassiveWord, sizeof(uMassiveWord));
} }
return uMin + uNext; return uMin + uNext;
#endif #endif
@ -188,11 +202,11 @@ namespace Aurora::RNG
#else #else
auto uRange = uMax - uMin; auto uRange = uMax - uMin;
auto uMassiveWord = NextU32(); auto uMassiveWord = NextU32();
auto uUpperBound = AuPageRoundUp<AuUInt32>(uRange, 2); auto uUpperBound = RngConvertBounds(uRange + 1);
AuUInt32 uNext {}; AuUInt32 uNext {};
while ((uNext = (uMassiveWord & (uUpperBound - 1))) > uRange) while ((uNext = (uMassiveWord & (uUpperBound - 1))) > uRange)
{ {
uMassiveWord = NextU32(); uMassiveWord = AuFnv1a32Runtime(&uMassiveWord, sizeof(uMassiveWord));
} }
return uMin + uNext; return uMin + uNext;
#endif #endif
@ -209,11 +223,11 @@ namespace Aurora::RNG
return NextU32() % uCount; return NextU32() % uCount;
#else #else
auto uMassiveWord = NextU32(); auto uMassiveWord = NextU32();
auto uUpperBound = AuPageRoundUp<AuUInt32>(uCount, 2); auto uUpperBound = RngConvertBounds(uCount);
AuUInt32 uNext {}; AuUInt32 uNext {};
while ((uNext = (uMassiveWord & (uUpperBound - 1))) >= uCount) while ((uNext = (uMassiveWord & (uUpperBound - 1))) >= uCount)
{ {
uMassiveWord = NextU32(); uMassiveWord = AuFnv1a32Runtime(&uMassiveWord, sizeof(uMassiveWord));
} }
return uNext; return uNext;
#endif #endif