글
[엉뚱한실험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();
...
}
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();
...
}
{
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 인스턴스는 자기가 구성한 시스템 내에 전역적으로 한 개 정도만
만들어 놓고 공유해서 쓰는 것이 좋겠다는 것입니다.
'Silverlight Old > Experiment' 카테고리의 다른 글
Silverlight와 WebService(.NET 3.5) 연동하기 (5) | 2007.12.26 |
---|---|
Silverlight와 WebService(.NET 2.0) 연동하기 (0) | 2007.12.25 |
[엉뚱한실험5] Silverlight객체와 Html엘리먼트 Overlap (4) | 2007.12.20 |
[엉뚱한실험4] Transform이 적용된 객체에서 MouseEventArgs GetPosition 결과값 비교 (0) | 2007.12.18 |
[엉뚱한실험3] TextBlock에서 "A", "B"의 ActualWidth 합과 "AB"의 ActualWidth는 같을까요? (0) | 2007.12.18 |
Blend를 통해 User Control 추가하기 (1) | 2007.12.14 |
[엉뚱한실험2] 잘 키운 Random인스턴스 하나, 열 인스턴스 안부럽다! (1) | 2007.10.16 |
[엉뚱한실험1] 한 객체에 추가한 여러 개의 이벤트 어떤 순서로 실행되나! (0) | 2007.10.16 |
전역적으로 만들어 놓고 사용하는 것이 불편하다고 생각하시는 분은
Local에서 선언할 때 static으로 하시면 됩니다.
static Random rd = new Random(); 이렇게 말이죠. ^^