본문 바로가기

프로그래밍/기본기ㆍ자료구조

C# Random - System.Random

728x90
반응형

- 시드 값에 따라 난수를 생성하는 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;
}

 

아래 링크를 통해 전체 코드를 볼 수 있다.

 

Reference Source

 

referencesource.microsoft.com

아직 전부 이해하지는 못 했고 커누스 알고리즘부터 차근차근 알아봐야겠다.

다람쥐와 포동포동이

 

 

 

 

 

RememberCook 9월 28일 정식 출시!

두번째 게임인 RememberCook이 출시되었습니다. 귀여운 캐릭터들이 나오는 간단한 게임이며 플레이어의 공간인지능력을 테스트하는 게임입니다. 아래 링크를 통해 다운 받으실 수 있으니 많은 관

chipmunk-plump-plump.tistory.com

반응형

'프로그래밍 > 기본기ㆍ자료구조' 카테고리의 다른 글

Foreach에 관하여  (2) 2021.03.01
메모리 풀과 오브젝트 풀  (0) 2021.02.11
스레드와 프로세스의 차이  (0) 2021.02.07
C# string 비교 == 과 Equals()  (1) 2021.02.05
OOP 객체지향 5가지 원칙  (1) 2021.02.04