最近项目要做一个红包抽奖,到抽奖算法的时候纠结了~
在网上找了一个http://blog.youkuaiyun.com/hengyunabc/article/details/19177877/
其中把他67和82的地方放开,效果还不错(他为什么注释掉我也不清楚)
然后考虑,希望实现正态分布的效果
又找到了这个方法
Math.sqrt(b)*random.nextGaussian()+a;
参考自:http://blog.sina.com.cn/s/blog_8eee7fb60101rqvd.html
但是方差的选择很难,要么就是方差过小,分布都集中在平均值上,要么就是方差过大,过滤掉太多不用的数据,造成分布效果不如意。
后来又找到一个
public double Norm_rand(double miu, double sigma2){
double N = 12;
double x=0,temp=N;
do{
x=0;
for(int i=0;i<N;i++)
x=x+(Math.random());
x=(x-temp/2)/(Math.sqrt(temp/12));
x=miu+x*Math.sqrt(sigma2);
}while(x<=0); //在此我把小于0的数排除掉了
return x;
}
N 代表总份数,miu 代表 均值 sigma2标准差
不过当你希望你的最大值和最小值是可变的时候这个方法就不太好了。
几个方法各有缺点,我个人最后选择了第一种
在此做个记录,以后再考虑吧。