随机数的java实现(概率算法)
具体问题描述以及C/C++实现参见网址
http://blog.csdn.net/liufeng_king/article/details/8978740
public class Toss {
public static Radom coinToss;
public static int tossCoins(int numberCoins){
//随机抛硬币
int i=0;
int tosses=0;
coinToss=new Radom();
for(i=0;i<numberCoins;i++){
//radom(2)=1表示正面,0表示反面
tosses+=coinToss.random(2);
}
return tosses;
}
/**
* 测试程序
*/
public static void main(String[] args) {
//Radom coinToss=new Radom();
int ncoins=10;
long ntosses=50000L;
//heads[i]是得到i次正面的次数
int i=0;
long[] heads=new long[ncoins+1];
int j;
int position;
//初始化数组heads
for(j=0;j<ncoins+1;j++)
heads[j]=0;
//重复50000次模拟事件
for(i=0;i<ntosses;i++)
heads[tossCoins(ncoins)]++;
System.out.println();
//输出频率图
for(i=0;i<=ncoins;i++){
position=(int)((float)heads[i]/ntosses*72);
System.out.print(" "+i);
for(j=0;j<position-1;j++){
System.out.print(" ");
}
System.out.println("*");
}
}
}
class Radom {
private long seed;//当前种子
private final static long multiplier=0x5DEECE66DL;
private final static long adder=0xBL;
private final static long mask=(1L<<48)-1;
//构造方法,自动产生种子
public Radom(){
this.seed=System.currentTimeMillis();
}
//构造方法,缺省值为0表示由系统自动产生种子
public Radom(long seed){
if(seed==0)
this.seed=System.currentTimeMillis();
else
this.seed=seed;
}
//产生[0...n-1]之间的随机整数
public int random(int n){
if(n<=0)
throw new IllegalArgumentException("n must be positive");
seed=(seed*multiplier+adder)&mask;
return((int)(seed>>>17)%n);
}
//产生[0,1]之间的随机实数
public double fRandom(){
return random(Integer.MAX_VALUE)/(double)Integer.MAX_VALUE;
}
}