강좌와 팁

선형 합동법을 이용한 난수 발생기 날짜:2021-12-26 4:38:09 조회수:131
작성자 : 소년가장
포인트 : 438
가입일 : 2020-02-02 00:50:03
방문횟수 : 54
글 42개, 댓글 27개
소개 : 자기소개
작성글 보기
쪽지 보내기
선형 합동법(Linear Congrential Generator) 줄여서 LCG라고 불리는 알고리즘을 이용한 난수 발생기 소스입니다.
C# 콘솔 프로젝트를 생성한 후 다음 소스를 붙여 넣으면 바로 동작을 확인해 볼 수 있습니다.

using System;

namespace cstestcon
{
    public class RandomGenerator
    {
        public UInt32 seed;

        public RandomGenerator()
        {
            DateTime now = DateTime.Now;
            // 현재 시간의 분과 초를 곱해 무작위한 씨점을 만든다.
            this.seed = (UInt32)(now.Minute * now.Second);
        }

        public RandomGenerator(UInt32 seed)
        {
            // 지정한 씨점을 사용함으로써 일정한 난수를 얻는다.
            this.seed = seed;
        }

        public int GetRandom(int from, int to)
        {
            // 고의로 오버플로우를 유발하여 무작위한 난수를 만든다.
            seed = seed * 8906299 + 91764051;
            // 요청한 범위안의 수를 고른다. 
            return (int)(seed % (to - from) + from);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            RandomGenerator R = new RandomGenerator();
            for (int i =0; i < 10; i++)
            {
                // 1 ~ 6까지의 주사위 수를 고른다. 
                // 끝 범위는 제외됨을 유의할 것
                Console.WriteLine(R.GetRandom(1, 7));
            }
        }
    }
}

1 ~ 6 사이의 난수 10 개를 출력합니다.
현재 시간을 씨점으로 사용하므로 실행할 때마다 다른 결과가 나타납니다.

그런데... 이딴 걸 왜 만드냐구요?
C#에 이미 잘 만들어진 Random 클래스가 있는데 그걸 쓰면 되지.
그렇죠. 난수 자체가 목적이면 라이브러리의 클래스를 활용하면 됩니다.

그런데 이런걸 만들어 써야 하는 이유는 소스 품질 검사기에 Random이 걸리기 때문입니다.
SI 프로젝트는 기계가 소스 품질을 검사하는데 흐름이 이상하거나 자원 해제를 제대로 하지 않으면 지적질이 들어옵니다.
Random  클래스를 사용하면 흐름이 일정치 않다는 경고가 발생해요.

테스트 데이터 생성을 위해 Random이 필요해도 기계가 경고를 하니 어쩔 수 없어요.
물론 예외 사항으로 등록 신청해서 피해갈 수도 있지만 절차가 복잡해 귀찮은거죠.
그래서 Random을 대신할 사용자 정의 클래스가 필요해지더라구요.

또, 난수 발생 알고리즘 연구용으로도 가치가 있고요.












 



오늘도 최선을 다 하자.

목록보기 삭제 수정 신고 스크랩


로그인하셔야 댓글을 달 수 있습니다.