banner SAPE.RU
Flash-MX.ru: Форум о Flash - Not logged in
Forum На главную Help Search Login
Previous Next Up Topic Flash CS3, Flash 8, Flash-MX 2004, Flex / Обмен опытом / вопрос к математикам (11666 hits)
- By pogga (***) Date 29-06-05 12:05
не знаю куда это отнести, поэтому спрашиваю здесь.

мне нужно во флеше получить набор 10 случайных чисел, например в пределах сотни, но так, чтобы чем больше число, тем меньше была вероятность его выпадения. никак что то не придумывается формула под это дело... =\
Parent - By Fisher Date 29-06-05 12:08
тоесть сотня имеет вероятность выпада - 0 % а единица - 100% ??????
Parent - By pogga (***) Date 29-06-05 12:20 Edited 29-06-05 12:30
ну типа того, только не так жестко - у единицы 100% не надо 8))

ближе к телу - от 30 у сотни до 70 у единицы
Parent - By Fisher Date 29-06-05 12:56
суть в том что есть возможность получить простое случайное число. пусть это Х (икс) :)

после того как мы его получили надо его проверить и скорректировать.

взять  X и взять дополнительны Y (игрек) от 1 до 7 

дальше нужно шаманство  с математикой.
Parent - By pogga (***) Date 29-06-05 12:58
угу, это понятно, вот на шаманстве я и застрял :(:
Parent - By Fisher Date 29-06-05 13:01
обрати внимание на простую вещь - параболу или гиперболу.
Parent By pogga (***) Date 29-06-05 13:31
ага, общий принцип я понял. сенкс )
Parent - By Iv (*) Date 29-06-05 13:11 Edited (M) 29-06-05 13:48
МинимизироватьПо высоте текста
   1
   2
   3
   4
   5
   6
   7
   8
   9
 Math.gaussianRandom = function () {
 var a, b, c;
 do {
 a = 2 * Math.random () - 1;
 b = 2 * Math.random () - 1;
 c = a * a + b * b;
 } while (c >= 1);
 return b * Math.sqrt ((-2 * Math.log (c)) / c);
 };

- это формула с распределением по гауссу.
щас напишу с распределением в степени.
iv
Parent - By svtol Date 12-11-07 05:56
заюзал это для графити...
тормозит безбожно....
ну и не много не догнал пока как задать разброс точек
Parent By Nox Noctis (hero) Date 12-11-07 08:53 Edited 12-11-07 08:58
прочитай, что такое нормальное распределение.

Отформатировано для для АС3:
(mean = среднее значение, deviation = разброс (среднеквадратичное отклонение))
МинимизироватьПо высоте текста
   1
   2
   3
   4
   5
   6
   7
   8
   9
  10
  11
  12
  13
  14
  15
  16
  17
  18
  19
  20
  21
  22
  23
  24
  25
  26
  27
  28
  29
  30
  31
  32
  33
  34
  35
  36
  37
 package org.noregret.math 
 {
 
   /**
    * @author Nox Noctis
    */
   final public class Random 
   {
     public static function gaussianRandomPolar(mean : Number, deviation : Number) : Array
     {
       var x1 : Number, x2 : Number;
       var y1 : Number, y2 : Number;
       var w : Number;
       
       // Преобразование Бокса-Мюллера      
       // Box-Muller transform      
       do {
         x1 = 2.0 * Math.random() - 1.0;
         x2 = 2.0 * Math.random() - 1.0;
         w = x1 * x1 + x2 * x2;
       } while ( w >= 1.0 );
     
       w = Math.sqrt((-2.0 * Math.log(w) ) / w);
     
       y1 = x1 * w * deviation + mean;
       y2 = x2 * w * deviation + mean;
       
       return [y1, y2];
     }
 
     public static function gaussianRandom(mean : Number, deviation : Number) : Number
     {
       var point:Array = gaussianRandomPolar(mean, deviation);
       return Math.sqrt(point[0] * point[0] + point[1] * point[1]);
     }  
   }
 }

Берется величина, распределенная равномерно (Math.random()) и переводится в величину, распределенную стандартно.
В данном случае используется один из самых быстрых алгоритмов такого перевода - преобразование Бокса-Мюллера.

Используется так:
МинимизироватьПо высоте текста
   1
   2
   3
   4
   5
   6
   7
 import org.noregret.math.Random;
 
 // получаем массив из двух элементов: [x, y]
 var coord:Array = Random.gaussianRandomPolar(0, 100);
 
 // получаем одно неотрицательное число
 var value:Number = Random.gaussianRandom(0, 100);
http://vtulka.mybrute.com
Parent - By Nox Noctis (hero) Date 12-11-07 09:29
выглядит это примерно так:
http://noregret.org/tutor/gaussian/
http://vtulka.mybrute.com
Parent - By svtol Date 13-11-07 07:51
работает действительно шустрее намного, но!
резултат представляет собой сектор круга, где происходит распыление. т.е. если подержать на одном месте перо то получается четверть круга.
Видимо что то не так задаю...

объясните пожалуйста как этим пользоваться. Мне нужно что бы отдавал радиус круга в котором распылять точки.

МинимизироватьПо высоте текста
   1
   2
   3
   4
   5
  // получаем массив из двух элементов: [x, y]
  var coord:Array = Random.gaussianRandomPolar(0, 100);
  
  // получаем одно неотрицательное число
  var value:Number = Random.gaussianRandom(0, 100);


МинимизироватьПо высоте текста
   1
   2
   3
   4
   5
   6
 for (a=1; a<intensiv; a++) {
 min = -(br_size/4);
 max = (br_size/4);
 
 child.graphics.drawEllipse(m_x + Random.gaussianRandomPolar(min, max), m_y+Random.gaussianRandomPolar(min, max), 1, 1);
       }

br_size - размер пера
m_x - координата курсора
m_y - координата курсора
intensiv - интенсивность распыления
Parent By Nox Noctis (hero) Date 13-11-07 08:51
МинимизироватьПо высоте текста
   1
   2
   3
   4
   5
   6
   7
   8
   9
  10
  11
  12
  13
  14
  15
  16
  17
  18
  19
  20
  21
  22
  23
 import org.noregret.math.Random;
 import flash.display.Sprite;
 
 var child:Sprite = new Sprite();
 child.graphics.lineStyle(1, 0x660000, .5);
 addChild(child);
 
 var intensiv:Number = 1000;
 var br_size:Number = 100;
 var m_x:Number = 100;
 var m_y:Number = 100;
 
 var point:Array;
 var min:Number = -(br_size/4);
 var max:Number = (br_size/4);
 
 for (var a:Number = 1; a<intensiv; a++) {
   point = Random.gaussianRandomPolar(min, max);
   
   child.graphics.beginFill(0xCCCC00, .5);
   child.graphics.drawCircle(m_x + point[0], m_y + point[1], 5);
   child.graphics.endFill();
 }


- рандом в полярной форме выдает случайную точку - массив с координатами [x, y]. прибавлять массив к числу довольно странно.
- вычислять параметры лучше до вызова функции (стиль лучше)
- если переменные не меняются между итерациями, незачем вычислять их в теле цикла (min, max).
http://vtulka.mybrute.com
Parent - By Nox Noctis (hero) Date 13-11-07 09:07
и это.
там не min и max, а среднее значение и разброс.

var coord:Array = Random.gaussianRandomPolar(0, 100);

означает следующее: дай мне случайную точку вокруг точки (0, 0) при среднем разбросе радиусов в 100 пикселей.
при этом получившаяся точка может запросто выходить за пределы окружности с радиусом 100.
http://vtulka.mybrute.com
Parent By svtol Date 16-11-07 10:30
спасибо все заюзал, работает. если кому нужен исходник рисовалки с аэрографом пишите svtol[собака]1nsk.ru
Parent - By Iv (*) Date 29-06-05 13:27 Edited (M) 29-06-05 13:44
МинимизироватьПо высоте текста
   1
   2
   3
   4
   5
   6
   7
   8
   9
  10
  11
  12
  13
  14
  15
  16
  17
  18
  19
  20
  21
  22
  23
  24
  25
  26
  27
  28
 _global.exponentRandom = function(max_value, exponent) {
   exponent = exponent || 2
   var num = Math.pow(max_value, 1/exponent);
   num = Math.random()*num
   num = Math.pow(num, exponent);
   num = Math.round(num);
   return num;
 };
 this.checkExponentRandom = function(num, exponent, iterations) {
   if (num<=0) {
     return false
   }
   iterations = iterations || 100
   var mc = this.createEmptyMovieClip('test_mc', 0);
   mc._x = mc._y = num
   mc.lineStyle(5, random(0xFFFFFF), 100)
   for (var i = 0; i<iterations; i++) {
     var angle = random(360)*Math.PI/180;
     var radius = exponentRandom(num, exponent);
     var x = radius* Math.cos(angle)
     var y = radius* Math.sin(angle)
     mc.moveTo(x, y)
     mc.lineTo(x+.5, y)
   }
 };
 this.onMouseUp = function  () {
   this.checkExponentRandom(300)
 }


пользуйтесь тегом AS
iv
Parent - By pogga (***) Date 29-06-05 13:30
о-ёоо..
пасиба большое
..буду ночью разбираться чё к чему
Parent By Iv (*) Date 29-06-05 13:57
или вот вариант, делаем кляксы:

МинимизироватьПо высоте текста
   1
   2
   3
   4
   5
   6
   7
   8
   9
  10
  11
  12
  13
  14
  15
  16
  17
  18
  19
  20
  21
  22
  23
  24
  25
  26
  27
  28
  29
  30
  31
  32
  33
  34
  35
  36
  37
  38
 _global.exponentRandom = function(max_value, exponent) {
   exponent = exponent || 2;
   var num = Math.pow(max_value, 1/exponent);
   num = Math.random()*num;
   num = Math.pow(num, exponent);
   num = Math.round(num);
   return num;
 };
 this.checkExponentRandom = function(num, exponent, iterations) {
   if (num<=0) {
     return false;
   }
   iterations = iterations || 100;
   var mc = this.createEmptyMovieClip('test_mc', 0);
   mc._x = mc._y=num;
   var arr = [];
   for (var i = 0; i<iterations; i++) {
     var angle = random(360)*Math.PI/180;
     var radius = exponentRandom(num, exponent);
     arr.push({angle:angle, radius:radius});
   }
   arr.sortOn("angle");
   var x = arr[0].radius*Math.cos(arr[0].angle);
   var y = arr[0].radius*Math.sin(arr[0].angle);
   mc.beginFill(0, 50);
   mc.moveTo(x, y);
   for (var i = 1, len = arr.length; i<len; i += 2) {
     var cx = arr[i-1].radius*Math.cos(arr[i-1].angle);
     var cy = arr[i-1].radius*Math.sin(arr[i-1].angle);
     var ex = arr[i].radius*Math.cos(arr[i].angle);
     var ey = arr[i].radius*Math.sin(arr[i].angle);
     mc.curveTo(cx, cy, ex, ey);
   }
   mc.endFill()
 };
 this.onMouseUp = function() {
   this.checkExponentRandom(200, .5, 100);
 };
iv
Parent - By Iv (*) Date 29-06-05 14:11
вариант броуновского движения:

МинимизироватьПо высоте текста
   1
   2
   3
   4
   5
   6
   7
   8
   9
  10
  11
  12
  13
  14
  15
  16
  17
  18
  19
  20
  21
  22
 var mc = this.createEmptyMovieClip('test_mc', 0);
 mc._x = mc._y=num;
 this.checkExponentRandom = function(num, exponent, iterations) {
   if (num<=0) {
     return false;
   }
   iterations = iterations || 100;
   var mc = this.test_mc;
   mc.clear();
   for (var i = 0; i<iterations; i++) {
     var angle = (Math.random()+random(360))*Math.PI/180;
     var radius = exponentRandom(num, exponent);
     var x = radius*Math.cos(angle);
     var y = radius*Math.sin(angle);
     mc.lineStyle(12-radius/num*10, 0x990000, 100);
     mc.moveTo(x, y);
     mc.lineTo(x+.5, y);
   }
 };
 this.onEnterFrame = function() {
   this.checkExponentRandom(200, .2, 500);
 };
iv
Parent - By Fisher Date 29-06-05 14:42
Броуновского движения невидно :(
Parent - By Nirth (**) Date 29-06-05 14:53
Iv забыл добавить метод exponentRandom
МинимизироватьПо высоте текста
   1
   2
   3
   4
   5
   6
   7
   8
   9
  10
  11
  12
  13
  14
  15
  16
  17
  18
  19
  20
  21
  22
  23
  24
  25
  26
  27
  28
  29
  30
  31
 
 var mc = this.createEmptyMovieClip('test_mc', 0);
 mc._x = mc._y = num;
 _global.exponentRandom = function(max_value, exponent) {
    exponent = exponent || 2;
    var num = Math.pow(max_value, 1/exponent);
    num = Math.random()*num;
    num = Math.pow(num, exponent);
    num = Math.round(num);
    return num;
  };
 this.checkExponentRandom = function(num, exponent, iterations) {
   if (num <= 0) {
     return false;
   }
   iterations = iterations || 100;
   var mc = this.test_mc;
   mc.clear();
   for (var i = 0; i < iterations; i++) {
     var angle = (Math.random() + random(360)) * Math.PI / 180;
     var radius = exponentRandom(num, exponent);
     var x = radius * Math.cos(angle);
     var y = radius * Math.sin(angle);
     mc.lineStyle(12 - radius / num * 10, 0x990000, 100);
     mc.moveTo(x, y);
     mc.lineTo(x + .5, y);
   }
 };
 this.onEnterFrame = function() {
   this.checkExponentRandom(200, .2, 500);
 };
я смотрю форум в линейном режиме, так что не стоит удивлятся если я отвечаю не в той ветке где надо
Parent - By Fisher Date 29-06-05 17:10
не... один фиг это не движение. Где тут движение? это расколбас какойто. Прикольный расколбас конечно но проц грузит неподецки
Parent By Iv (*) Date 30-06-05 18:17
примеры имеют единственной целью показать задавшему вопрос возможности
функции exponentRandom, поиграться с настройками, увидеть как она себя ведет.
при этом примеры могут и проц грузить, особенно если заставить обсчитывать
и рисовать тысячи точек. но не думаю, что это скажется на достижении главной цели.
iv
Previous Next Up Topic Flash CS3, Flash 8, Flash-MX 2004, Flex / Обмен опытом / вопрос к математикам (11666 hits)
 

с 19.04.2006

Page created in 0.639s with 17 database queries.