Difference between revisions of "LlFrand/ru"
(Created page with "{{LSL_Function/ru |sort=Frand |func=llFrand|func_id=8|func_sleep=0.0|func_energy=10.0 |p1_type=float|p1_name=mag|p1_desc=Любое вещественное значение |ret…") |
|||
(2 intermediate revisions by the same user not shown) | |||
Line 5: | Line 5: | ||
|return_type=float | |return_type=float | ||
|return_text=вещественное псевдослучайное число в интервале {{Interval|gte=0.0|lt='''mag'''|lth=mag|center=return}} (если {{LSLP|mag}} положительно) или {{Interval|lte=0.0|gt='''mag'''|gth=mag|center=return}} (если {{LSLP|mag}} отрицательно).{{Interval/Footnote}}<br/> | |return_text=вещественное псевдослучайное число в интервале {{Interval|gte=0.0|lt='''mag'''|lth=mag|center=return}} (если {{LSLP|mag}} положительно) или {{Interval|lte=0.0|gt='''mag'''|gth=mag|center=return}} (если {{LSLP|mag}} отрицательно).{{Interval/Footnote}}<br/> | ||
|func_footer= | |func_footer=При переводе вещественных чисел в целые следует применять операцию типового преобразования <code>([[integer]])</code> , а ''не'' функции округления ([[llRound]], [[llFloor]], [[llCeil]]). (Понятия не имею, почему --прим. пер.) | ||
|caveats=* | |caveats=*Данный генератор случайных чисел не является абсолютным. | ||
** | **Последовательность случайных чисел постоянна для всего процесса. Следовательно, данный генератор неприменим для задач, в которых требуется полностью предсказуемый или непредсказуемый результат. | ||
* | *Следует помнить, что при задании целочисленного значения на месте {{LSLP|mag}} оно будет преобразовано в вещественный тип. При задании целого числа вне отрезка {{Interval|lte=+2<sup>23</sup>|gte=-2<sup>23</sup>|gteh=-2^32|lteh=+2^32|center=integer}} оно может быть неправильно воспринято программой (вследствие ограничений вещественного типа). Аналогично, использование данной функции для генерирования случайного целого числа выдаст результат, содержащий не больше 24 случайных бит. | ||
|examples=<lsl>// Tosses a coin, giving a *near* 50:50 chance of a result. | |examples=<lsl>// Tosses a coin, giving a *near* 50:50 chance of a result. | ||
integer coin_toss() | integer coin_toss() | ||
Line 150: | Line 151: | ||
|also_footer | |also_footer | ||
|notes= | |notes= | ||
=== | ===Для большей случайности=== | ||
{{Unreferenced|section|February 12, 2012}} | {{Unreferenced|section|February 12, 2012}} | ||
Как сказано выше, llFrand() выдаёт псевдослучайное число (лишь напоминающее случайное). | |||
Можно еще больше "ослучайнить" результат посредством предварительного вывода случайного количества случайных чисел. Пример: | |||
<lsl>//FOR AN INCREASINGLY RANDOM NUMBER: | <lsl>//FOR AN INCREASINGLY RANDOM NUMBER: | ||
// creates a significantly "more random" random number | // creates a significantly "more random" random number | ||
Line 163: | Line 163: | ||
integer actual_number=llFrand(100)+1; // generate the final truly-random number | integer actual_number=llFrand(100)+1; // generate the final truly-random number | ||
</lsl> | </lsl> | ||
Здесь, случайное (до 50) количество раз вызывается функция генерации случайного числа. Это значительно повышает фактор случайности финального результата actual_number. | |||
|cat1=Math | |cat1=Math | ||
|cat2=Float | |cat2=Float | ||
|cat3 | |cat3 | ||
}} | }} |
Latest revision as of 09:47, 29 August 2012
LSL Портал | | | Функции | | | События | | | Типы | | | Константы | | | Потоки | | | Библиотека Скриптов | | | Учебники |
Общая информация
Function: float llFrand( float mag );8 | Номер функции |
0.0 | Задержка |
10.0 | Энергия |
Возвращает вещественное псевдослучайное число в интервале [0.0, mag) (если mag положительно) или (mag, 0.0] (если mag отрицательно).[1]
• float | mag | – | Любое вещественное значение |
При переводе вещественных чисел в целые следует применять операцию типового преобразования
(integer)
, а не функции округления (llRound, llFloor, llCeil). (Понятия не имею, почему --прим. пер.)Предостережения
- Данный генератор случайных чисел не является абсолютным.
- Последовательность случайных чисел постоянна для всего процесса. Следовательно, данный генератор неприменим для задач, в которых требуется полностью предсказуемый или непредсказуемый результат.
- Следует помнить, что при задании целочисленного значения на месте mag оно будет преобразовано в вещественный тип. При задании целого числа вне отрезка [-223, +223] оно может быть неправильно воспринято программой (вследствие ограничений вещественного типа). Аналогично, использование данной функции для генерирования случайного целого числа выдаст результат, содержащий не больше 24 случайных бит.
Примеры
<lsl>// Tosses a coin, giving a *near* 50:50 chance of a result. integer coin_toss() {
if( llFrand(1.) < .5 ) return TRUE; return FALSE;
}
// Sometimes it is useful to get a random integer over a given range. This is a surprisingly tricky and emotive subject // and has caused endless discussion on the scripting groups. // The primary cause of probability errors when employing llFrand is to have a varying bin size on the edges of the range. // // As the bracket notation indicates, [0.0, mag), the function is inclusive of the 0.0 and exclusive of the entered value. // Because an LSL floating point number is only a subset of real numbers and does not have infinite granularity, this schema // will work for any float greater than float t = 1.175494351e-38; at which value the function will // return only zero. At a float beyond this, a math error occurs.
// Random integer generator // Contributed by Mephistopheles Thalheimer, original function posited by Hg Beeks
// Returns a pseudo-random integer in the range of min to max inclusive.
// Rationale: Expands the range by 1.0 to ensure equal bin spacing on ends relative to the middle of // the range and then uses an integer cast to round towards zero.
// Caveats: This function is not range checked and will fail if 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>// Simple integer random number tester // Contributed by Mephistopheles Thalheimer
// This is a random number tester designed to give a quick visual explanation and proof of why some // random integer functions just do not work. // In general, with any random number generator, if you can see a pattern emerging, then chances are, // the function is not random.
// The test case given "silly_random_integer( .. )" shows the type of pitfalls that can happen. Superficially, // it would seem like a good candidate. I thought so, and in fact mooted it in a discussion, however, a bit of thought reveals // that the first and last bin are only collecting rounded results from half the float space as the rest of the integers. // They are therefore under-represented in output, and the generator is flawed.
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 - Suitable for apps which require repeatable results that feel random.
Заметки
Для большей случайности
This section does not cite any references or sources. Please help improve this article by adding citations to reliable sources. Unsourced material may be challenged and removed. |
Как сказано выше, llFrand() выдаёт псевдослучайное число (лишь напоминающее случайное). Можно еще больше "ослучайнить" результат посредством предварительного вывода случайного количества случайных чисел. Пример: <lsl>//FOR AN INCREASINGLY RANDOM NUMBER: // creates a significantly "more random" random number integer loop=0; integer count=(integer) llFrand(50); // generate a random number of loops while(loop <= count){llFrand(1);++loop;} // generate random numbers within the loop integer actual_number=llFrand(100)+1; // generate the final truly-random number </lsl> Здесь, случайное (до 50) количество раз вызывается функция генерации случайного числа. Это значительно повышает фактор случайности финального результата actual_number.
См. также
Функции
• | llListRandomize |