Xorshift를 이용한 난수 발생기(C언어)

C 언어의 rand 함수를 이용하면 쉽게 난수를 발생시킬 수 있다. 하지만 품질이 떨어진다는 단점이 있다. Xorshift를 이용하면 빠르면서도 품질이 좋은 난수를 발생시킬 수 있다.

아래는 0에서 1사이의 난수를 xorshift를 이용하여 발생시키는 소스이다.

i 값을 조절하여 난수 개수를 바꿀 수 있다.

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>

uint32_t seed = 7;  // 100% random seed value(unsigned 32bit)

uint32_t  t;
double rdouble();
static uint32_t random()
{

t = time(NULL);
seed ^= t<<15;
seed ^= seed << 13;
seed ^= seed >> 17;
seed ^= seed << 5;
return seed;
}

int main()

{

int i;

printf(“between 0 ~ 1 random value\n”);
double m = 0,n=0;
for (i = 0; i < 100000; i++) {
m = rdouble();
n = n + m;
printf(“%.17f\n “, m);
//printf(“\n”);
//printf(“%d\n”, i);
}
printf(“\n”);
printf(“%d times mean\n”,i);
printf(“%.17f\n”,n/i);
return 0;

}
double rdouble() {

return (double) random() / 0xffffffff;
}

100개의 난수 평균 0.495인 것을 확인 할 수 있다. 평균 0.5에서 오차는 0.96%이다.

123

1000개의 난수 평균 0.494인 것을 확인할 수 있다. 평균 0.5에서 오차는 1.13%이다.345

난수 10만개를 생성한 결과는 아래와 같다. 난수의 평균은 0.50067으로 평균 0.5에서 오차는 약0.14%가 났다.

%ec%a0%9c%eb%aa%a9-%ec%97%86%ec%9d%8c

 

seed 값이 같을 때 생성되는 난수가 항상 같기 때문에 time(NULL)을 넣어줘서 생성되는 난수가 그 때 그 때 달라지도록 만들어 줄 수 있다.

xorshift 방법을 이용하면 간단한 알고리즘으로 빠르고 비교적 품질도 좋은 난수들을 얻을 수 있다.

 

 

참조

http://excamera.com/sphinx/article-xorshift.html

 

댓글 남기기