Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Управление случайными событиями (http://www.flasher.ru/forum/showthread.php?t=206503)

XoJlToH 07.02.2014 15:32

Управление случайными событиями
 
Господа, поделитесь, как вы управляете генерацией случайных (или не совсем) элементов.
Есть задача - генерировать случайные игровые элементы, при чем с изменением управляющей переменной должны меняться вероятности генерации тех или иных элементов. Например:

Код:

K - управляющий коэффициент
P - значение вероятности (не обязательно из теорвера)
A, B, C, D - элементы

Можно рассмотреть два крайних случая K=0 и K=1. Промежуточные значения тоже существуют.

Ситуация 1:
K=0
P (A,K) - 10%
P (B,K) - 40%
P (C,K) - 20%
P (D,K) - 30%

Ситуация 2:
K=1
P (A,K) - 2%
P (B,K) - 88%
P (C,K) - 4%
P (D,K) - 6%

Сейчас генератор таких элементов работает по принципу K*90-Math.random()*(100-K*90) и далее иф/элсом смотрим в каком дипапзоне выпало число. Хочется чего то более гибкого.

GBee 07.02.2014 16:14

А ТЗ у вас нет? Опишите получше.

Gaen 07.02.2014 17:17

1. Каждому элементу задаем вес.
2. Суммируем веса, получаем диапазон от 0 до суммы весов, на который будут мапиться наши элементы.
3. Генерируем случайное число в этом диапазоне.
4. Проверяем, на какой элемент попало число.

Пример.
Пусть есть 3 элемента A, B, C с весами 1, 2 и 3 соответственно.
Сумма весов - 6.
Если выпало от 0 до 1, то это А
Если выпало от 1 до 3, то это B
Если выпало от 3 до 6, то это С

Добавлено через 10 минут
Если нужно при помощи одной "ручки" управлять весами, то я бы задал некую морфающую функцию f(x), где x - это индекс элемента. Соответственно, перед генерацией пропускать веса через нее.
Код AS3:

for(var i:uint = 0; i < elements.length; i++)
{
    //...
    var morphedWeight = elements[i].weight * morph(i);
    //...
}


silin 07.02.2014 17:28

Код AS3:

package 
{
        import flash.display.Sprite;
        import flash.events.Event;
 
 
        public class Main extends Sprite
        {
 
                private var weghts0:Array = [10, 40, 20, 30];
                private var weghts1:Array = [2, 88, 4, 6];
 
                public function Main():void
                {
                        var weights:Array = getWeghts(0.5);
                        var test:Array = [];
                        for (var i:int = 0; i < 40; i++)
                        {
                                test.push(weightedRand(weights));
                        }
 
                        trace( "test : " + test );
 
                }
                private function getWeghts(k:Number):Array
                {
                        var res:Array = [];
                        for (var i:int = 0; i < 4; i++)
                        {
                                res.push(k * weghts1[i] + (1 - k) * weghts0[i]);
                        }
                        return res;
                }
 
                private function weightedRand(weights:Array):int
                {
 
                        var arr:Array = [];
                        var sum:Number = 0;
                        for (var i:int = 0; i < 4; i++)
                        {
                                sum += weights[i];
                                arr.push(sum);
                        }
                        var rnd:Number = sum * Math.random();
                        var res:int = 0;
                        while (rnd > arr[res]){res++}
                        return res;
                }
 
        }
 
}

Добавлено через 19 минут
если сумма весов неизменна, то все сведется к такому
Код AS3:

private var weightsSum:Number = 100;
private function weightedRand(k:Number):int
{
 
        var sum:Number = 0;
        var rnd:Number = weightsSum * Math.random();
        for (var i:int = 0; i < 4; i++)
        {
                sum += k * weghts1[i] + (1 - k) * weghts0[i];
                if (rnd < sum)
                {
                        return i;
                }
        }
        return -1;
}


Koopa 08.02.2014 07:07

Math.random() -псевдо случайная выборка из диапазона 0-1. Так что конечная выборка генерируется для разных задач разная. Что вы ожидаете получить от (100-к*90)? Вы получаете либо 0-(-100), либо 90-80.


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

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