http://www.gamedevforever.com/114
rand() 함수보다 더 빠르고 난수 분포율도 더 나은 Well 알고리즘을 적용한 난수 발생기
-C++ 버전
namespace GRandom {
//
unsigned long state[16];
unsigned int index = 0;
//
void init(unsigned long seed) {
for (int i=0; i<16; ++i) {
state[i] = seed;
}
}
//
unsigned long get() {
unsigned long a, b, c, d;
a = state[index];
c = state[(index+13)&15];
b = a^c^(a<<16)^(c<<15);
c = state[(index+9)&15];
c ^= (c>>11);
a = state[index] = b^c;
d = a^((a<<5)&0xDA442D20UL);
index = (index+15)&15;
a = state[index];
state[index] = a^b^d^(a<<2)^(b<<18)^(c<<28);
return state[index];
}
//
int getInt(int nMin, int nMax) {
return (int)(get()%(nMax- nMin) ) + nMin;
}
}
[출처] 난수 (WELL512 알고리즘)|작성자 그라파
- C# 버전
public class Well512
{
static uint[] state = new uint[16];
static uint index = 0;
static Well512()
{
Random random = new Random((int)DateTime.Now.Ticks);
for (int i = 0; i < 16; i++)
{
state[i] = (uint)random.Next();
}
}
internal static uint Next(int minValue, int maxValue)
{
return (uint)((Next() % (maxValue - minValue)) + minValue);
}
public static uint Next(uint maxValue)
{
return Next() % maxValue;
}
public static uint Next()
{
uint a, b, c, d;
a = state[index];
c = state[(index + 13) & 15];
b = a ^ c ^ (a << 16) ^ (c << 15);
c = state[(index + 9) & 15];
c ^= (c >> 11);
a = state[index] = b ^ c;
d = a ^ ((a << 5) & 0xda442d24U);
index = (index + 15) & 15;
a = state[index];
state[index] = a ^ b ^ d ^ (a << 2) ^ (b << 18) ^ (c << 28);
return state[index];
}
}
[출처] WELL512 난수 발생 알고리즘 - C#|작성자 techshare
'프로그래밍 > c++' 카테고리의 다른 글
c++ 천단위마다 콤마(,) 찍기 (0) | 2013.06.18 |
---|---|
디버깅시 유용한 파일 이름, 라인 넘버, 함수이름 남기기 (0) | 2013.05.29 |
어셈블리어 __nop() 의 용도. (0) | 2013.04.29 |
프로세스 이름으로 프로세스 id 또는 핸들 찾기 (0) | 2013.04.26 |
임의로 등록한 MFC UI가 바로 적용 안될때 (0) | 2013.04.26 |