티스토리 뷰
목차
Well512 알고리즘 예제, 난수 생성기, 랜덤 포레스트 (Random Forest)
주요 참조 사이트 : 표준 rand()함수보다 유용한 난수 생성기 알고리즘 – MT, WELL512 [링크]
소스 코드 - WindowsFormsApplication1.zip [링크] (원본은 아래 아래 아래..쯤에 있는 정성태씨의 것을 수정)
먼저 Well512 알고리즘에 대해 위 사이트를 참조해보면 요점은 이것입니다.
- C++의 표준 rand() 함수
- rand() 함수의 분포는 그리 고르지 않다. 특히 작은 표본을 사용할때는 더욱 그렇다.
즉, 이말은 1~10까지 랜덤(난수 생성기)을 1억번쯤 돌리면, 확률이 다들 비슷하게 나오긴 하지만, 10번 정도만 돌릴때에는 1 하나만 10번이 나온다거나 하는 가능성이 있다는 것입니다.
- rand() 함수는 전역 함수이다. 어디서든 사용이 가능하다. 이 함수는 표준 함수이기 때문에, 코드의 어디에서도 호출이 가능합니다. 그래서 호출 되는 경우를 제어할 수 가 없습니다.
그래서 즉슨, 메르센 트위스터(MT)란 난수 생성기를 고안한 디자이너가 후일에 제작한, WELL512를 사용하는 것이 더 적절하다는 것입니다.
실제로도 위의 사이트에 접속하면 아래와 같은 사진을 근거로 효율성이 더 좋다고 합니다.
C/C++의 rand함수
CPlusPlus - WELL512 함수 예
그렇지만 100%는 없다고... WELL512 알고리즘이 C#에선 매력적이지 않습니다.
사실, 결과적으로 보면 Well512 클래스 자체가 닷넷에서는 크게 의미가 없어 보입니다.
왜냐하면, C++ 의 rand() 함수(난수 생성기)가 전역적인 반면 닷넷의 System.Random 타입은 인스턴스가 지역적으로 관리될 수 있기 때문에 두 기기간의 동기화를 맞추는 데 전혀 문제가 없습니다.
그렇지만, 굳이 활용도를 생각해 본다면 서로 다른 언어간의 동기화를 맞출 일이 있는 경우겠지요.
WELL 소스 코드가 간단하기 때문에 자바로도 포팅이 가능하기 때문입니다.
TEST - 1
CPlusPlus - rand 함수 예 (난수 생성기)
TEST - 2
CPlusPlus - WELL512 함수 예 (난수 생성기)
그리고, 폼에 점을 찍어봐도 두 알고리즘의 차이를 크게 느끼기 힘듭니다.
1. 1,000,000 (좌 rand, 우 well512)
1. 1,000,000(좌 rand, 우 well512)
2. 100,000 (좌 rand, 우 well512)
2. 100,000(좌 rand, 우 well512)
3. 10,000 (좌 rand, 우 well512)
3. 10,000(좌 rand, 우 well512)
4. 1,000(좌 rand, 우 well512)
4. 1,000(좌 rand, 우 well512)
뻔한 말이지만, 시의적절한 사용이 정답이네요.
Well512 알고리즘 예제, 난수 생성기, 랜덤 포레스트 (Random Forest)