import java.util.Random; public class Gillespie { private static Random random = new Random(); public static double uniform() { return random.nextDouble(); } public static int poisson(double lambda) { // using algorithm given by Knuth // see http://en.wikipedia.org/wiki/Poisson_distribution int k = 0; double p = 1.0; double L = Math.exp(-lambda); do { k++; p *= uniform(); } while (p >= L); return k-1; } public static double exp(double lambda) { return -Math.log(1 - Math.random()) / lambda; } public static void main(String[] args) { for (int j=0;j<10;j++){ int N = Integer.parseInt(args[0]); // pop size double avgBirthRate = Double.parseDouble(args[1]); // mean birth rate double avgDeathRate = Double.parseDouble(args[2]); // mean death rate int M = Integer.parseInt(args[3]); // number of iterations double birthRate = 0.0; double deathRate = 0.0; double lambda = 0.0; double t = 0.0; double p = 0.0; double pBirth = 0.0; double pDeath = 0.0; double time = 0.0; for (int i=0;i 0; i++){ birthRate = avgBirthRate * N; deathRate = avgDeathRate * N; lambda = birthRate + deathRate; t = exp(lambda); p = Math.random(); pBirth = birthRate/(birthRate + deathRate); pDeath = deathRate/(birthRate + deathRate); time = time + t; if (p <= pBirth) N++; else N--; System.out.printf("%.5f %d %d",time,N,i+1); System.out.println(); } } } }