QQ截图20150324172339

控制随机——产生不同概率的事件

本文将对产生不同概率的方法和高斯分布的使用做总结。

在实际情况中我们有时候不光只是要随机,有时候还要不同概率大小情况的下的随机事件,比如发生A事件的几率是30%,B事件是40%,等等.实现它有多种方法,最只觉得想法的就是在一个数组里填充几种元素,通过控制各元素的个数来控制概率,比如我要A事件发生的概率为40%,B事件发生的概率为60%.可以造一个长度为10的boolean数组,里面4个设置为true,另外6个位false,然后随机从里面抽一个出来,true就发生事件A,false就发生事件B。代码如下:

boolean array = new boolean[10];
array[0] = true;
...
array[3] = true;

if (array[random(0,10)]){
    triggerA();
}else{
    triggerB();
}

这个方法的弊端是当有多样元素的填充很麻烦,并且浪费不必要的空间。

另一个办法,这个办法更简单:

比如我想要一个概率为60%的A事件,发生概率为20%的B事件,20%的C事件代码如下:

float p = 0.6;
float rand = random(1); // return a number betwenn 0~1
if( rand < p){
    triggerA();
}else if ( p < rand < 0.8){
    triggerB();
} else {
    triggerC();
}

 

有时候我们需要概率随着一定规律变化,比如从1~100中选择数字,要求实现数字越大选中的概率越大,可以用二次随机的方法(这种方法也叫Monte Carlo method)。

下面的例子返回一个0~1的数,概率大小的变化和数字大小成正比 p = value

float montecarlo(){
    while(true){
        float r1 = random(1);
        float p = r1;
        float r2 = random(1);
        if( r2 < p){
            return r1;
        }
    }
}

可以通过修改上面代码很容易得出概率和数字成正比的随机函数的方法.

高斯分布又叫正态分布(本文后续全部使用正态分布这个叫法),这是生活中出现很多的随机分布现象,比如人的身高,财富情况都是正太分布.下面我介绍一下如何把正态分布用于随机中.

要使用正态分布,首先要明白两个参数,mean 和 deviation:

 正态分布mean是中值,也就是数据最集中的那里.deviation是偏差的意思.也就是和中值偏差的大小.有了这两个值就可以用来对高斯分布进行操纵了,偏差越小意味着数据越集中在中值处,偏差越大意味着数据越分散.那么到底在程序中要怎么用正态分布呢?下面用Java里的Random.nextGaussian()为例,它会返回一个mean为0,deviation为1的随机数字.我们做一个在窗口中大小为600的画布上用正态分布画彩色球小的程序:

import java.util.Random;
Random gen;

int r = 0;
int g = 0;
int b = 0;
float x = 0;
float y = 0;

void setup(){
    // 设置屏幕大小为600
  size(600,600);
  gen = new Random();
}
// 这里是循环执行的部分
void draw(){
  float num = (float) gen.nextGaussian();
  float standardDeviation = 40;  // 偏差设置为80
  float mean = 300;             // 中间值设为300,屏幕的中中心
  
  // 随机产生小球的颜色
  r = int(random(255));
  g = int(random(255));
  b = int(random(255));
  fill(r,g,b);
  
  // 这里就是使用状态分布的地方了 偏差 * 正太分布产生的随机数 + 偏差
  // 产生小球的坐标
  x = standardDeviation * num + mean;
  
  num = (float) gen.nextGaussian();
  y = standardDeviation * num + mean;
  // 画球
  ellipse(x,y,15,15);
  
}

ball1

 

这里是偏差为40时的运行截图,注意到因为偏差比较小小球都集中在屏幕中心,也就是中值附近.

当偏差为80时运行截图为:

ball2

 

注意到偏差较大的时候,求不在是特别集中于中值附近,成较分散状.

 

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>