[엉뚱한실험2] 잘 키운 Random인스턴스 하나, 열 인스턴스 안부럽다!

Silverlight Old/Experiment 2007.10.16 11:17

안녕하세요!
엉뚱한 실험 제2탄입니다.

랜덤 값을 20개 정도 만들어써야 한다고 가정합시다.
간단히 2가지 방법이 있을 수 있습니다.

방법 1 :
Random rd = new Random();
for (int i = 0; i < 20; i++)
{
    double dValue = rd.NextDouble();
    ...
}

방법 2 :
for (int i = 0; i < 20; i++)
{
    Random rd = new Random();
    double dValue = rd.NextDouble();
    ...
}

어떤 결과가 예상되시나요?
2가지 방법이 어떻게 다른지 실험을 해보았습니다.

사용자 삽입 이미지



방법2에서는 같은 값만 만들어내는 것을 볼 수 있습니다.

Random 값을 생성하는 메커니즘이 시간(time)을 기반으로 하다보니,
빠른 속도로 생성하여 같은 시점에 생성된 Random인스턴스가
NextDouble 메서드를 통해 처음으로 내뱉는 값은 같은 값이 됩니다.

[방법2] for 루프 내부에 중단점(Break Point)을 걸어놓고 천천히 루프를 진행하면서
서로 다른 시간에 Random Instance가 생성될 수 있게 하면서 NextDouble의 리턴 값을
관찰해보면, 서로 다른 임의의 값을 얻을 수 있는 것을 확인할 수 있습니다.

대부분 방법1을 쓰지 누가 방법2를 쓰냐? 하시는 분 많으실 줄로 압니다.

하지만 예를 들어 우리가 만든 유저 컨트롤에서,
생성될 때마다 어떤 프로퍼티가 랜덤 값을 가지고 있길 바란다면,
생성자에서 Random 객체를 하나 생성하여 그 프로퍼티에 랜덤 값을 설정해 주는
코드를 넣게 될 가능성이 높습니다.

이후 어떤 코드에서 for 루프를 돌던지 하여 빠른 속도로,
그 객체 인스턴스를 100개 생성한다고 가정하면, [방법2] 같은 현상이 발생하게 되어,
그 객체가 가진 그 프로퍼티는 획일적인 값을 가지게 되는 일이 발생하게 됩니다.

그렇게 우리는 또 실수를 할 수 있습니다.
결론은 Random 인스턴스는 자기가 구성한 시스템 내에 전역적으로 한 개 정도만
만들어 놓고 공유해서 쓰는 것이 좋겠다는 것입니다.

설정

트랙백

댓글

  • BlogIcon 길버트 2007.10.24 16:15 신고 ADDR 수정/삭제 답글

    전역적으로 만들어 놓고 사용하는 것이 불편하다고 생각하시는 분은

    Local에서 선언할 때 static으로 하시면 됩니다.

    static Random rd = new Random(); 이렇게 말이죠. ^^