LlFrand/ko

From Second Life Wiki
Jump to navigation Jump to search

설명

함수: 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의 관련항목이 도움을 줄 수 있을 지도 모릅니다.