以下两个测试类,即两种实现思路。均由公司同事提供,本人记录分享给大家。
具体实现思路请看代码。。。。。
测试类一:
public class WGRandom {
/**
*
* @author wangguan
*
*/
public static void main(String[] args) {
int a = 0;
int b = 0;
int c = 0;
int d =0;
int e = 0;
int f = 0;
int i = 10;
for (int j = 0; j < 10000000; j++) {
switch (i = doRamdon()) {
case 0:
a++;
break;
case 1:
b++;
break;
case 2:
c++;
break;
case 3:
d++;
break;
case 4:
e++;
break;
case 5:
f++;
break;
default:
System.out.println(">>>>>>>>>>>>" + i);
break;
}
}
System.out.println("a : " + a + " b : " + b + " c :" + c+ " d :" + d+ " e :" + e+ " f :" + f);
System.out.println(a+b+c+d+e+f);
}
private static int doRamdon() {
double[] ds = new double[] {1.0 , 50.0 , 4.0 , 15.0 , 10.0 , 20.0 };
double sum = getSum(ds);
double last = 0;
for (int i = 0; i < ds.length; i++) {
sum = sum- last;
double random = Math.random();
if (random <= ds[i] / sum) {
return i;
}
last = ds[i];
}
return 5;
}
private static double getSum(double[] weight) {
double sum = 0;
for (double d : weight) {
sum += d;
}
return sum;
}
}
测试类二:
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
/**
*
* @author hehaifeng
*
*/
public class HFRandom {
static Map<Integer , Integer > ds = new HashMap<Integer , Integer> () ;
private static boolean getRamdon(int random , int randomNum) {
int belance = randomNum - random;
if(belance >= 0) {
return true;
}
return false;
}
public static void main(String[] args) {
ds.put(50, 0);
ds.put(1, 0);
ds.put(4, 0);
ds.put(15, 0);
ds.put(10, 0);
ds.put(20, 0);
System.out.println(ds);
for (int i = 0; i < 10000000; i++) {
int random = org.apache.commons.lang.math.RandomUtils.nextInt(100);
random++;
for (int key : ds.keySet()) {
if(getRamdon(random, key)){
ds.put(key, ds.get(key)+1 );
break;
}else {
random -= key;
}
}
}
System.out.println(ds);
int sum=0;
for (Iterator iterator = ds.entrySet().iterator(); iterator.hasNext();) {
Entry<Integer, Integer> entry = (Entry<Integer, Integer>) iterator.next();
sum=sum+entry.getValue();
}
System.out.println(sum);
}
}