|
|
|||||
Регистрация: Sep 2006
Сообщений: 145
|
Управление случайными событиями
Господа, поделитесь, как вы управляете генерацией случайных (или не совсем) элементов.
Есть задача - генерировать случайные игровые элементы, при чем с изменением управляющей переменной должны меняться вероятности генерации тех или иных элементов. Например: 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% |
|
|||||
strange mood
|
1. Каждому элементу задаем вес.
2. Суммируем веса, получаем диапазон от 0 до суммы весов, на который будут мапиться наши элементы. 3. Генерируем случайное число в этом диапазоне. 4. Проверяем, на какой элемент попало число. Пример. Пусть есть 3 элемента A, B, C с весами 1, 2 и 3 соответственно. Сумма весов - 6. Если выпало от 0 до 1, то это А Если выпало от 1 до 3, то это B Если выпало от 3 до 6, то это С Добавлено через 10 минут Если нужно при помощи одной "ручки" управлять весами, то я бы задал некую морфающую функцию f(x), где x - это индекс элемента. Соответственно, перед генерацией пропускать веса через нее.
__________________
тонкий тролль, осеянный благодатью |
|
|||||
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; } } } если сумма весов неизменна, то все сведется к такому |
|
|||||
Banned
[+1 30.08.14]
[+1 26.02.14] Регистрация: Apr 2012
Сообщений: 162
|
Math.random() -псевдо случайная выборка из диапазона 0-1. Так что конечная выборка генерируется для разных задач разная. Что вы ожидаете получить от (100-к*90)? Вы получаете либо 0-(-100), либо 90-80.
|
Часовой пояс GMT +4, время: 03:08. |
|
« Предыдущая тема | Следующая тема » |
Опции темы | |
Опции просмотра | |
|
|