calculate the binomial distribution : Distribution « Development Class « Java






calculate the binomial distribution

 
import java.util.Random;


/**
 * BeehiveZ is a business process model and instance management system.
 * Copyright (C) 2011  
 * Institute of Information System and Engineering, School of Software, Tsinghua University,
 * Beijing, China
 *
 * Contact: jintao05@gmail.com 
 *
 * This program is a free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation with the version of 2.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 */


/**
 * @author Tao Jin
 * 
 */

public class Util{

  // calculate the binomial distribution
  // ret[0] stores the number user given
  // ret[1] stores the count of the corresponding number in ret[0] with the
  // same index
  // for some number, the count maybe 0.
  // the parameter validation must be finished in advance
  public static long[][] getBinomialDistribution(int min, int max, long total) {
    Random rand = new Random(System.currentTimeMillis());
    int n = max - min;
    long[][] ret = new long[2][n + 1];
    int mean = (n + 1) / 2;
    float p = 1;
    if (n > 0) {
      p = (float) mean / (float) n;
    }

    long count = 0;
    for (int i = 0; i <= n; i++) {
      double p_i = combination(n, i) * Math.pow(p, i)
          * Math.pow((1 - p), (n - i));
      long count_i = (long) (total * p_i);
      ret[0][i] = i + min;
      ret[1][i] = count_i;
      count += count_i;
    }

    while (count < total) {
      int i = rand.nextInt(n + 1);
      ret[1][i]++;
      count++;
    }

    return ret;
  }
  // calculate the combination
  // the value would be very large, so store it in the type of double
  public static double combination(int n, int k) {
    double ret = 1;
    while (k > 0) {
      ret = ret * ((double) n / (double) k);
      k--;
      n--;
    }
    return ret;
  }

}

   
  








Related examples in the same category

1.Return a sample from the Gamma/Poission/Gaussian distribution, with parameter IA
2.calculate the discrete uniform distribution