int * rdNum() { // 랜덤으로 사원번호를 생성하는 함수 int * ran; ran = (int*)calloc(MAX, sizeof(int)); int i; srand((unsigned)time(NULL)); unsigned int init[32]; for (int i = 0; i<32; i++) { init[i] = rand() << 16 | rand(); // WELL Random 을 초기화 하기 위해, C 표준 rand() 함수를 이용하여 init 값을 생성합니다 // WELL Random 을 사용하는 이유 1. 사원번호 최대값이 99999이기 때문에 2. 표준 함수보다 속도가 빠르기 때문에 } InitWELLRNG1024a(init); // WELL Random 초기화 // 기본 사용법 - min ~ max 범위의 난수 //double x = (double)WELLRNG1024a() * (max-min+1) + min; //사원번호의 중복을 방지하기 위해 MAX크기의 배열에 1부터 99999까지의 숫자를 차례대로 넣은 후 카드 섞기 방식으로 난수 배열 생성. for (i = 0; i<MAX; i++) { ran[i] = i+1; } srand((unsigned)time(NULL)); int rana; for (i = 0; i<MAX; i++) { rana = (int)((double)WELLRNG1024a() * (MAX-i+1)) + i; int prev; prev = ran[i]; ran[i] = ran[rana]; ran[rana] = prev; } return ran; }
void well_random_engine_test() { unsigned int init[1391] = { 0, }; for( int i = 0; i < sizeof( init )/sizeof( init[0] ); ++i ) { init[i] = rand(); } #define MASK32 0xffffffffU #define JMAX 16 init[0] = 123456789; for( int i = 1; i < JMAX; ++i ) init[i] = (663608941 * init[i - 1]) & MASK32; InitWELLRNG512a( init ); InitWELLRNG1024a( init ); InitWELLRNG19937a( init ); InitWELLRNG44497a( init ); g_rand(); { DWORD start = GetTickCount(); for( int i = 0; i < total_rand_count; ++i ) { double r = g_rand.gen(); r; } DWORD runing = GetTickCount() - start; std::wcout << L"g_rand run time: " << runing << std::endl; } { DWORD start = GetTickCount(); for( int i = 0; i < total_rand_count; ++i ) { double r = WELLRNG512a(); r; } DWORD runing = GetTickCount() - start; std::wcout << L"WELL512 run time: " << runing << std::endl; } { DWORD start = GetTickCount(); for( int i = 0; i < total_rand_count; ++i ) { double r = WELLRNG1024a(); r; } DWORD runing = GetTickCount() - start; std::wcout << L"WELL1024 run time: " << runing << std::endl; } { DWORD start = GetTickCount(); for( int i = 0; i < total_rand_count; ++i ) { double r = WELLRNG19937a(); r; } DWORD runing = GetTickCount() - start; std::wcout << L"WELL19937 run time: " << runing << std::endl; } { DWORD start = GetTickCount(); for( int i = 0; i < total_rand_count; ++i ) { double r = WELLRNG44497a(); r; } DWORD runing = GetTickCount() - start; std::wcout << L"WELL44497 run time: " << runing << std::endl; } }