- 시드 값에 따라 난수를 생성하는 Random Class다
- 생성자로 Random(int32)와 Random()이 있다.
- 한정된 숫자 집합에서 동일한 확률로 난수를 선택한다.
- 완전히 임의적이지는 않다.
(그러나 실용적으로 봤을 때 충분히 사용해도 될만한 난수)
Random() 생성자
- *Environment.TickCount을 시드로 사용한다.
(*프로그램이 시작 된 이후 경과된 시간을 밀리초 단위로 얻는다.)
- 15밀리초 내에 만든 개체들은 동일한 난수 값을 가질 가능성이 크다.
(동시에 여러 난수 개체를 만들 경우 동일한 난수를 갖게될 가능성이 높다는 말이다.)
Random(int32)
- 사용자가 임의의 시드값을 넣어 초기화할 수 있다.
- Random() 생성자를 사용 시 내부에서 Random(Environment.TickCount)를 호출하여 Random(int32) 생성자가 호출되도록 되어 있다.
초기화
- 생성자에서 임의의 시드값(TickCount나 사용자 지정 값)과 고정된 *MSEED 시드값을 이용하여 시드배열을 초기화한다. (* MSEED의 값은 const int MSEED = 161803398; 으로 고정이다.)
- 도널드 *커누스 서브트랙션 난수 생성기 알고리즘을 기반으로 구현되었다고 한다.
(* 커누스 알고리즘은 아직 완전히 파악하지 못하여 추후에 글을 갱신하도록 하겠습니다.)
아래는 Random함수의 생성자 부분 코드블럭을 가져옴
public Random(int Seed)
{
int ii;
int mj, mk;
int subtraction = (Seed == Int32.MinValue) ? Int32.MaxValue : Math.Abs(Seed);
mj = MSEED - subtraction;
SeedArray[55]=mj;
mk=1;
for (int i=1; i<55; i++)
{
ii = (21*i)%55;
SeedArray[ii]=mk;
mk = mj - mk;
if (mk<0)
mk+=MBIG;
mj=SeedArray[ii];
}
for (int k=1; k<5; k++)
{
for (int i=1; i<56; i++)
{
SeedArray[i] -= SeedArray[1+(i+30)%55];
if (SeedArray[i]<0)
SeedArray[i]+=MBIG;
}
}
inext=0;
inextp = 21;
Seed = 1;
}
아래 링크를 통해 전체 코드를 볼 수 있다.
아직 전부 이해하지는 못 했고 커누스 알고리즘부터 차근차근 알아봐야겠다.
'프로그래밍 > 기본기ㆍ자료구조' 카테고리의 다른 글
Foreach에 관하여 (2) | 2021.03.01 |
---|---|
메모리 풀과 오브젝트 풀 (0) | 2021.02.11 |
스레드와 프로세스의 차이 (0) | 2021.02.07 |
C# string 비교 == 과 Equals() (2) | 2021.02.05 |
OOP 객체지향 5가지 원칙 (1) | 2021.02.04 |