본문 바로가기
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)

반응형