'Random'에 해당되는 글 1건

  1. 2008.06.17 사용자 Random()만들기

random클래스는 임의의 난수를 추출하여 값을 반환하는 메서드이다. 사용법은 Math클래스에서 random()을 호출하면 된다.

* Math.random();
위처럼 메서드를 실행시키면 반환되는 값은 소수점 이하 15자리의 난수를 반환한다.
trace( NumberUtilities.random() )     // 출력 : 0.424370180349797

하지만 개발시 주로 사용하는 값은 정수를 많이 사용한다. 가령 "10개의 값중에 난수가 1이면 공격하라"라고 개발하였다면 10분의 1확율로 공격을 할 것이다. 난수가 0.xxxxxxxx..... 이면 공격하라...개발도 지저분 해질 것이다. 따라서 난수의 값에 연산을 하여 필요한 값을 얻어야 한다.

* 두자리 정수를  얻기위한 연산
trace( Math.random()*100 )     // 출력 : 99.72788169980049
위처럼 100을 곱하면 난수 자체가 소수점 이하의 값이므로 두자리의 정수와 소수점이하 15개의 값을 얻을 수 있다. 따라서 아래처럼 수정하여 사용 하면 정수만 추출할 수 있다.
trace( Math.floor( Math.random()*100 ) );     // 출력 99
필요한 값을 얻기 위해서 이렇게 난수에 연산과 올림/내림을 적절하게 사용하여야 한다.

* AS3에서 아쉬운 랜덤의 범위
AS 1에서는 random(10) 을 하면 0~9까지 10개의 정수중 1개를 리턴하였다. 하지만 AS3에서는 이러한 기능이 사라져 버렸다. 따라서 범위를 구하고 싶으면 따로 개발해야한다... 그러나 ascb에서는 이러한 범위를 구할 수 있는 메서드를 만들어 제공하고 있다.

NumberUtilities.random( 작은수 , 큰수 , 구간 )
가령 random(0,10) 으로 실행시키면 0~10까지의 값이 반환하고록 되어있다.
심지어 반올림까지 할 수 있도록 Interval까지 설정하게 되어있다.
 random(0,10,2)으로 설정하면 2의 곱인 값(근접하게 반올림)이 반환된다. 또는  random(0,10,10)으로 하면 0과 10의 1곱인 10만이 반환된다. 훌륭하다...
하지만 단점은 기본 기능인 소수점 이하 15개의 난수를 얻는 것이 없다..-_-;;;

기본기능을 사용하고 싶을때는 다시 Math.random()을 호출하여야 한다. util의 기능은 가급적 여러 클래스에서 불러와 사용하는 것 보다는 캡슐화된 유틸을 사용하는 것이 좋다...
그래서 기본기능을 포함한 랜덤클래스를 ascb를 활용하여 만들어 보았다.

private static var _minimum:Number;
private static var _maximum:Number;
private static var _roundToInterval:Number = 1
public static function random( minimum:Number = 0, maximum:Number = 0 ,
                                             roundToInterval:Number = 1 ):Number
{
   _minimum = minimum;
   _maximum = maximum;
   _roundToInterval = roundToInterval;

    //범위를 설정하지 않았을 때 Math.random()을 호출 그값을 반환
    //범위가 설정 되어있으면 section()을 실행하여 범위내 정수를 반환
    return ( minimum == 0 && maximum == 0 ) ?  original() : section();
}
 
//소수점 이하 난수를 반환
private static function original():Number
{
   return Math.random();
}
 
//범위에서 정수를 추출하여 반환 
private static function section():Number
{
     if(_minimum > _maximum) {
          var tmp:Number = _minimum;
          _minimum = _maximum;
          _maximum = tmp;
       }
 
       var nDeltaRange:Number = (_maximum - _minimum) + (1 * _roundToInterval);
       var nRandomNumber:Number = Math.random() * nDeltaRange;
       nRandomNumber += _minimum;
       
       return Math.floor(nRandomNumber / _roundToInterval) * _roundToInterval;
}



이 클래스는 random()만 호출시에는 기본 랜덤 메서드인 Math.random()의 반환값을 반환하고 구간을 설정하면 구간내의 값을 반환하게 되어있다. 물론 인터벌도 설정하여 설정값의 근접한 값에 반올림 하돌록 되어있다.
1) trace( NumberUtilities.random() )                                  // 출력 : 0.872785918880254
2) trace( Math.floor( NumberUtilities.random()*100 ) );        // 출력 : 66
3) trace( NumberUtilities.random(0,100,10) )                       // 출력 : 50
4) trace( NumberUtilities.random(10,20,3) )                        // 출력 : 18
5) trace( NumberUtilities.random(10,20,5) )                         //출력 : 15

2번과 3번은 세자리수 100을 제외한 같은 범주의 값을 반환한다.

Posted by 버터백통