LlFrand/ko

From Second Life Wiki
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

설명

함수: float llFrand( float mag );

반환되는 값은 [0.0,mag) 혹은 (mag, 0.0] 범위의 의사난수.
mag의 부호가 반환값의 범위를 결정한다.

• float mag 임의의 유효한 실수값

명세

mag의 부호에 따라 [0.0, mag) 또는 (mag, 0.0] 범위의 의사난수를 반환한다.

주의

이 난수 발생기는 전산에서 간단한 작업을 위해 자주 쓰이는 의사난수(pseudo random number:씨앗값을 알면 재현가능한 유사난수)이다. 즉, 엄밀한 의미에서의 수학적인 난수는 아니다.

예제

<lsl> // *거의* 50:50으로 결과를 주는 동전던지기.

integer coin_toss() {

 if( llFrand(1.) < .5 ) return TRUE;
 return FALSE;

}

// 주어진 범위 내에서의 무작위 정수 생성은 때때로 유용하다. 또한 이것은 각종 스크립트 게시판에서 무한정 반복해서 토론이 벌어지는 // 기교적이고도 감정적인 주제이다. // llFrand를 수행할 때에 확률 오류가 나는 주 원인은 범위 내의 경계값 근처에서 단위 크기(bin size)가 영향을 주기 때문이다. // // 괄호 기호가 나타내듯이 [0.0,mag)은 0.0은 포함하고 입력된 mag 값은 포함하지 않는다는 의미이다. // LSL에서 float은 사실 실수가 아닌 그 부분집합인 유한소수이며 따라서 소숫점 이후로 숫자가 무한정 계속될 수 있는 그런 것이 아니다. // 그래서 t = 0.000000000000000000000000000000000000000000001보다 큰 숫자이어야 0이 아닌 것으로 인식하며 소숫점 이후 숫자길이가 // 이것을 넘어설 경우 수학 오류를 일으킨다. 입력값이 포함되지 않는다는 것은 Jody Palmer가 실험으로 215,000,000회 시행을 해서 내리는 결론이다.

// 무작위 정수 발생기 // Contributed by Mephistopheles Thalheimer, original function posted by Hg Beeks

// min에서 max(포함) 범위에서 의사 무작위 정수를 발생시킨다

// 원리: 범위를 1.0만큼 더 확장해서 단위 크기가 범위 중간에서 끝날 수 있게 한 후 정수로 어림한다. // 주의: 이 함수는 주어진 범위의 유효성은 따지지 않는다. 즉 max < min이면 엉뚱한 값을 출력한다.

integer random_integer( integer min, integer max ) {

 return min + (integer)( llFrand( max - min + 1 ) );

}

default {

   touch_start(integer total_number)
   {
       // When touched, say "Heads" with probability 0.5, 
       // otherwise, say "Tails."
       if ( coin_toss() )
           llSay(0, "Heads");
       else
           llSay(0, "Tails");

       integer n1 = random_integer( 2, 8 ); // Return a random number between 2 and 8
       llSay( PUBLIC_CHANNEL, "I chose a " + (string)n1 );

   }

} </lsl>

<lsl> // 간단한 정수 난수 검사기 // Contributed by Mephistopheles Thalheimer

// 이것은 왜 일부 무작위 정수발생 함수가 제대로 작동하지 않는지 시각적으로 바로 이해시키고 증명해준다. // 일반적으로 난수 발생기에서 어떤 일정한 유형을 자꾸 보게 된다면 해당 함수는 제대로 된 무작위가 아닐 가능성이 높다.

// 이 검사는 주어진 "silly_random_integer( .. )"함수에서 그러한 점이 나타남을 보여준다. 실은 이것은 다른 토론에서 한 차례 다루어진 것인데, // 겉으로 보기에는 잘 작동할 것 처럼 보인다. 본인도 처음에는 그렇게 생각했지만 조금만 더 생각해보면 처음과 마지막 단위에서는 나머지 정수부처럼 // 실수공간의 절반에서만 어림값을 추출하고 있다는 것을 알 수 있다. 따라서 결과값을 제대로 표현하지 못하는 것이며 생성기에 결함이 있는 것이다.

integer random_integer( integer min, integer max ) {

 return min + (integer)llFrand( max - min + 1 );

}

integer silly_random_integer( integer min, integer max ) {

 return min + (integer)( llRound( llFrand( max - min ) ) );  // Looks good, but does not work

}

// Simple integer random number tester // Contributed by Mephistopheles Thalheimer

list bins;

integer MIN = 2; // The minimum integer you want integer MAX = 5; // The maximum integer you want

integer NUMBER_OF_TRIES = 10000; // The bigger the better.. but slower

default {

   state_entry()
   {
       llSay( PUBLIC_CHANNEL, "Bin tester ready.");
       bins = [];
   }
   touch_start(integer total_number)
   {
       
       llSay( PUBLIC_CHANNEL, "Started, be patient" );
       
       integer i;
       integer r;
       
       integer range = MAX - MIN;
       
       for( i = 0; i <= range; ++i )
       {
           bins += [ 0 ];    
       }
       
       integer v;
       integer out_of_range;
       
       for( i = 0; i < NUMBER_OF_TRIES; ++i )
       {
           r = silly_random_integer( MIN, MAX );   // Replace this with the function you are testing
           // Note the output on this one has about 0.5 expected hits on the first and last bin
           //r = random_integer( MIN, MAX );
           
           if( r > MAX

유용한 조각

Pseudo-random_Number_Generator - 무작위 처럼 느껴지는 반복되는 결과들이 필요한 작업에 적당하다.

기록

이 난수 발생기는 무작위의 원천이 될 수 없다.

개별 난수의 발생은 공유된 전체의 일부이며 각각이 독립적인 씨앗에 의한 것이 아니다. 그러므로 의사 난수 발생은 수학적으로 완전히 예측가능하거나 완전히 예측불가능해야하는 엄밀한 작업에는 적당하지 않다.

함께 보기

함수

•  llListRandomize
이 글이 유용하지 않으세요? LSL Wiki의 관련항목이 도움을 줄 수 있을 지도 모릅니다.