LlFrand/ko
명세
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 |