We implemented a hierarchy of Java classes for distributional models (Figure 3.3). Java is the standard programming language for Internet applications (Prodan & Prodan Mihai, 1997) ; this is the reason why we used this language to create the infrastructure for e-learning scenarios. We present below Java classes implemented for some distributions, as well as simulation examples.

**Binomial distribution**

package Distrib;

public class DistribBinomial extends DistributionDiscrete {

public DistribBinomial(int n, double p) { // Constructor

this.n = n;

this.p = p;

}

public double simValue() { // Simulation of a value

double U, rap, pp, F;

U = Math.random();

rap = p/(1-p);

pp = Math.exp(n*Math.log(1-p)); // probability X=i

F = pp; // F(i)=P{X<=i} distribution function

double k = 0;

while (U > F) {

pp = (rap*(n-k)/(k+1))*pp;

F = F + pp;

k++;

}

return k;

} // simValue()

public double initRecursion() {// Initial value for recursion

return Math.pow(1-p, n); // P{X=0}

}

public double valRecursion(int k) {// Value for recursion

return (double)(n-k)*p/(k+1)/(1-p);

}

int n;

double p;

} ///;

**Poisson distribution**

package Distrib;

public class DistribPoisson extends DistributionDiscrete {

public DistribPoisson(double lambda) { // Constructor

this.lambda = lambda;

}

public double simValue() { // Simulation of a value

double U, pp, F;

U = Math.random();

pp = Math.exp(-lambda); // probability X=i

F = pp; // F(i)=P{X<=i} distribution function

double k=0;

while (U > F) {

pp = lambda*pp/(k+1);

F = F + pp;

k++;

}

return k;

} // simValue()

public double initRecursion() { // Initial value for recursion

return Math.exp(-lambda); // P{X=0}

}

public double valRecursion(int k) { // Value for recursion

return (double)lambda/(k+1);

}

double lambda;

} ///;

**Geometric distribution**

package Distrib;

public class DistribGeometric extends DistributionDiscrete {

public DistribGeometric(double p) { // Constructor

this.p = p;

}

public double simValue() { // Simulation of a value

double U; // geometric random variable in (0,1)

U = Math.random(); // Generate a random number

return (int)(Math.log(U)/Math.log(1-p));

} // simValue()

public double initRecursion() { // Initial value for recursion

return p; // P{X=0}

}

public double valRecursion(int k) { // Value for recursion

return 1-p;

}

double p;

} ///;

**Uniform discrete distribution**

package Distrib;

public class DistribDiscUniform extends DistributionDiscrete {

public DistribDiscUniform(int numb) { // Constructor

n = numb;

p = (double)1/n;

}

public double simValue() { // Simulation of a value

int X; // Random variable

double U; // Un iform random variable in (0,1)

U = Math.random(); // Generate a random number

return (int)(n*U);

} // simValue()

public double initRecursion() { // Initial value for recursion

return p; // P{X=0}

}

public double valRecursion(int k) { // Value for recursion

return (double) 1;

}

int n;

double p;

} ///;

**General discrete distribution**

package Distrib;

public class DistribDiscGen extends DistributionDiscrete {

public DistribDiscGen(int n, double[] p) { // Constructor

this.n = n;

this.p = p;

for (int i=0; i<p.length; i++) {

if (pMax<p[i]) pMax=p[i];

}

c = pMax*n;

}

public double simValue() { // Simulation of a value

Distrib.DistribDiscUniform dDU = new DistribDiscUniform(n);

do {

Y = (int)dDU.simValue();

U = Math.random();

}

while (U > (double)(p[Y]/(c/n)));

return Y;

} // simValue()

int n, Y;

double pMax=0, c, U;

double[] p = new double[n];

} ///;

**Normal stan****dard distribution**

package Distrib;

import Distrib.*;

import java.util.*;

public class DistribNormalS extends DistributionContinue {

public double simValue() { // Simulation of a value

double y1, y2, y, Z, U;

Distrib.DistribExponential Y1 = new Distrib.DistribExponential(1);

Distrib.DistribExponential Y2 = new Distrib.DistribExponential(1);

Random R = new Random();

do {

y1 = Y1.simValue();

y2 = Y2.simValue();

y = y2-Math.pow(y1-1, 2)/2;

} while (y<0);

U = R.nextDouble();

if (U<0.5) Z = y1;

else Z = -y1;

return Z;

} // simValue()

} ///;

**Normal distribution**

package Distrib;

public class DistribNormal extends DistributionContinue {

public DistribNormal(double miu, double sigma) { // Constructor

this.miu = miu;

this.sigma = sigma;

}

public double simValue() { // Simulation of a value

double Z;

Z = NS.simValue();

X = miu+sigma*Z;

return X;

} // simValue()

double miu, sigma, X;

Distrib.DistribNormalS NS = new Distrib.DistribNormalS();

} ///;

**Exponential distribution**

package Distrib;

public class DistribExponential extends DistributionContinue {

public DistribExponential(double lambda) { // Constructor

this.lambda = lambda;

}

public double simValue() { // Simulation of a value

U = Math.random();

X = -1/lambda*Math.log(U);

return X;

} // simValue()

double lambda, X, U;

} ///;

**Gamma distribution**

package Distrib;

public class DistribGamma extends DistributionContinue {

public DistribGamma(double lambda, int n) { // Constructor

this.lambda = lambda;

this.n = n;

}

public double simValue() { // Simulation of a value

double U, X=0;

for (int k=1; k<=n; k++) {

U = Math.random();

X = X-Math.log(U)/lambda;

}

return X;

} // simValue()

double lambda;

int n;

} ///;

**Weibull distribution**

package Distrib;

public class DistribWeibull extends DistributionContinue {

public DistribWeibull(double alfa, double beta) { // Constructor

this.alfa = alfa;

this.beta = beta;

}

public double simValue() { // Simulation of a value

double U;

U = Math.random();

X = 1/alfa*Math.pow(-Math.log(U), 1/beta);

return X;

} // simValue()

double alfa, beta, X;

} ///;

- 1891 reads