본문 바로가기
C++ 200제/코딩 IT 정보

Well512 알고리즘 예제, 난수 생성기, 랜덤 포레스트 (Random Forest)

by vicddory 2018. 7. 23.

Well512 알고리즘 예제, 난수 생성기, 랜덤 포레스트 (Random Forest)


랜덤 포레스트 random forest


주요 참조 사이트 : 표준 rand()함수보다 유용한 난수 생성기 알고리즘 – MT, WELL512 [링크]


소스 코드 - WindowsFormsApplication1.zip [링크] (원본은 아래 아래 아래..쯤에 있는 정성태씨의 것을 수정)


먼저 Well512 알고리즘에 대해 위 사이트를 참조해보면 요점은 이것입니다.


- C++의 표준 rand() 함수


- rand() 함수의 분포는 그리 고르지 않다. 특히 작은 표본을 사용할때는 더욱 그렇다.

즉, 이말은 1~10까지 랜덤(난수 생성기)을 1억번쯤 돌리면, 확률이 다들 비슷하게 나오긴 하지만, 10번 정도만 돌릴때에는 1 하나만 10번이 나온다거나 하는 가능성이 있다는 것입니다.

- rand() 함수는 전역 함수이다. 어디서든 사용이 가능하다. 이 함수는 표준 함수이기 때문에, 코드의 어디에서도 호출이 가능합니다. 그래서 호출 되는 경우를 제어할 수 가 없습니다.


그래서 즉슨, 메르센 트위스터(MT)란 난수 생성기를 고안한 디자이너가 후일에 제작한, WELL512를 사용하는 것이 더 적절하다는 것입니다.


실제로도 위의 사이트에 접속하면 아래와 같은 사진을 근거로 효율성이 더 좋다고 합니다.


WELL 512 알고리즘 난수 생성기C/C++의 rand함수


WELL 512 알고리즘CPlusPlus - WELL512 함수 예


그렇지만 100%는 없다고... WELL512 알고리즘이 C#에선 매력적이지 않습니다.


사실, 결과적으로 보면 Well512 클래스 자체가 닷넷에서는 크게 의미가 없어 보입니다.


왜냐하면, C++ 의 rand() 함수(난수 생성기)가 전역적인 반면 닷넷의 System.Random 타입은 인스턴스가 지역적으로 관리될 수 있기 때문에 두 기기간의 동기화를 맞추는 데 전혀 문제가 없습니다.


그렇지만, 굳이 활용도를 생각해 본다면 서로 다른 언어간의 동기화를 맞출 일이 있는 경우겠지요.


WELL 소스 코드가 간단하기 때문에 자바로도 포팅이 가능하기 때문입니다.


TEST - 1

난수 생성기 WELL 512 예제CPlusPlus - rand 함수 예 (난수 생성기)



TEST - 2

난수 생성기 랜덤포레스트CPlusPlus - WELL512 함수 예 (난수 생성기)



그리고, 폼에 점을 찍어봐도 두 알고리즘의 차이를 크게 느끼기 힘듭니다.

1. 1,000,000 (좌 rand, 우 well512)


WELL 512 랜덤포레스트 알고리즘1. 1,000,000(좌 rand, 우 well512)



2. 100,000 (좌 rand, 우 well512)


WELL 512 난수 생성 랜덤 포레스트2. 100,000(좌 rand, 우 well512)



3. 10,000 (좌 rand, 우 well512)


WELL 512 랜덤 포레스트3. 10,000(좌 rand, 우 well512)



4. 1,000(좌 rand, 우 well512)


WELL 512 알고리즘 랜덤 포레스트4. 1,000(좌 rand, 우 well512)


뻔한 말이지만, 시의적절한 사용이 정답이네요.


Well512 알고리즘 예제, 난수 생성기, 랜덤 포레스트 (Random Forest)

댓글