Mega Code Archive

 
Categories / Java / Development Class
 

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;   } }