Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 07.02.2014, 15:32
XoJlToH вне форума Посмотреть профиль Отправить личное сообщение для XoJlToH Найти все сообщения от XoJlToH
  № 1  
Ответить с цитированием
XoJlToH
 
Аватар для XoJlToH

Регистрация: 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%
Сейчас генератор таких элементов работает по принципу K*90-Math.random()*(100-K*90) и далее иф/элсом смотрим в каком дипапзоне выпало число. Хочется чего то более гибкого.

Старый 07.02.2014, 16:14
GBee вне форума Посмотреть профиль Отправить личное сообщение для GBee Найти все сообщения от GBee
  № 2  
Ответить с цитированием
GBee
 
Аватар для GBee

Регистрация: Jan 2009
Сообщений: 3,067
Записей в блоге: 3
Отправить сообщение для GBee с помощью Skype™
А ТЗ у вас нет? Опишите получше.
__________________
Чтобы доказать, что вы не робот, причините вред другому человеку.

Старый 07.02.2014, 17:17
Gaen вне форума Посмотреть профиль Отправить личное сообщение для Gaen Найти все сообщения от Gaen
  № 3  
Ответить с цитированием
Gaen
strange mood
 
Аватар для Gaen

модератор форума
Регистрация: Jul 2004
Адрес: Питер
Сообщений: 1,653
Записей в блоге: 1
Отправить сообщение для Gaen с помощью ICQ Отправить сообщение для Gaen с помощью Skype™
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);
    //...
}
__________________
тонкий тролль, осеянный благодатью

Старый 07.02.2014, 17:28
silin вне форума Посмотреть профиль Посетить домашнюю страницу silin Найти все сообщения от silin
  № 4  
Ответить с цитированием
silin
 
Аватар для silin

блогер
Регистрация: Mar 2003
Адрес: Моск. обл.
Сообщений: 5,269
Записей в блоге: 6
Код 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;
}

Старый 08.02.2014, 07:07
Koopa вне форума Посмотреть профиль Найти все сообщения от Koopa
  № 5  
Ответить с цитированием
Koopa
Banned
[+1 30.08.14]
[+1 26.02.14]

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

Создать новую тему Ответ Часовой пояс GMT +4, время: 18:10.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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