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