Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Math.random - процент выпадания (http://www.flasher.ru/forum/showthread.php?t=127629)

hrimz 19.07.2009 03:16

Math.random - процент выпадания
 
Подскажите пожалуйста каким образом можно регулировать процент выпадания определенных чисел, например 111 - 30% выпадания, 222 - 20% выпадания, 555 - 10% выпадания и т.д. Из общего диапазона от 001 до 999.

Как лучше генерировать - сразу трехзначное число или отдельно каждый разряд?

Есть такая функция для генерации чисел из заданного диапазона:

Код AS3:

function randRangeInt (low:uint, high:uint)
{
return Math.floor (Math.random() * (high - low + 1) + low);
}


ripeLime 19.07.2009 04:26

Рандом на то он и рандом, что шанс выпасть числу 9 из диапазона 1-1000 такой же, как и числу 899.

Первая идея, которая пришла в голову для решения вашей проблемы:

Закидываем числа от 1 до 999 в массив и обращаемся к случайному элементу массива array[Случайный номер] - шанс выпасть нужному вам числу(скажем 18) одинаков и равен 1/999, поэтому продливаем массив до 1000 элементов и загоняем туда нужный вам элемент(всё тоже число 18).
Теперь обращаемся к случайному элементу массива array[Случайный номер], только теперь, шанс выпасть нужному вам числу равен 2/1000, то есть в 2 раза больше чем у остальных чисел.

kackbip 19.07.2009 10:15

Подитожу:
заводим массив, в котором частота появления каждого числа пропорциональна нужной вам вероятности его выпадения. Далее случайным образом выбираем номер элемента массива и все.

VVall 19.07.2009 10:47

Только не надо делать действительно массив. Вместо него должны быть условия - если случайное число в определённом диапазоне, то возращать определённое значение.

Dima_DPE 19.07.2009 14:14

А можно и так
Код AS3:

function rand():int
{
var rnd:Number = Math.random();
if (rnd < 0.3) return 111; // 30% выпадения
if (rnd < 0.5) return 222; // 20% + 30% из предыдущего
if (rnd < 0.6) return 555; // 10%
return int(rnd * 1000);
}

Единственно, что процент 111 222 и 555 будет чуть больше 30%, 20% и 10% соответственно, но до тысячи выпаданий погрешность предельно мала.

twix1124 19.07.2009 17:38

Первая мысль была такой же=)
Но 0.6 - это 60% =\

Psycho Tiger 19.07.2009 20:30

60%, что выпадет 555, если не выпадет вот это:
Код AS3:

if (rnd < 0.3) return 111; // 30% выпадения
if (rnd < 0.5) return 222; // 20% + 30% из предыдущего

То есть 60% от 70% от 50%, как то так.

Dima_DPE 19.07.2009 21:23

Psycho Tiger, именно, спасибо, а то у меня даже не было слов, как twix1124 намекнуть, что надо читать мат часть, а потом...

hrimz 19.07.2009 21:36

Всем спасибо огромное!

Герыч 20.07.2009 00:58

точно такой же код хотел написать днём, но подумал, что не совсем понял вопрос. Если нужно точно 30,20 и 10 процентов, то можно так:
Код AS3:

function rand():int
{
var rnd:Number = Math.random();
if (rnd < 0.3) return 111; // 30% выпадения
if (rnd < 0.5) return 222; // 20% + 30% из предыдущего
if (rnd < 0.6) return 555; // 10%
var i:int;
do
{ i=int(rnd * 1000) }
while((i==111)||(i==222)||(i==555));
return i;
}



Часовой пояс GMT +4, время: 17:10.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.