指定概率随机数实现
2019-07-25 本文已影响0人
某某程序员_
在实际开发中,经常会遇见指定概率随机数得到某一个值。比如取到某个值的概率百分之几,取到另一个值的概率百分之几。
可以使用如下实现:
public static void main(String[] args){
//假设:有A\B\C 三个选项,实现随机取值:A的概率20% B的概率30% C的概率50%
//初始化包含一百个元素的列表,这里可以是 10个,100个,1000个,越大随机值越真实
//设置长度确保 1% 至 100% 每一个值都存在
List<String> strings = new ArrayList<>(100);
for (int i = 0; i < 100; i++) {
if (i <20){
strings.add("A");
}else if (i<50){
strings.add("B");
}else {
strings.add("C");
}
}
out.println("乱序前:" + strings.toString());
Collections.shuffle(strings);//打乱顺序,随机性更强
out.println("乱序后:" + strings.toString());
Random random = new Random();
Scanner sc = new Scanner(System.in);
int n = 0;
while (n > -1){
out.println("请输入随机次数:");
n = sc.nextInt();
out.println("随机次数=" + n);
int ACount = 0;
int BCount = 0;
int CCount = 0;
for (int i = 0; i < n; i++) {
int index = random.nextInt(100);//随机取数区间[0,100)
if (strings.get(index).equals("A")){//随机到A值
ACount++;
}else if (strings.get(index).equals("B")){//随机到B值
BCount++;
}else if (strings.get(index).equals("C")){//随机到C值
CCount++;
}
}
//使用BigDecimal计算,可以设置比值的精确度,本例取两位精度
out.println("A rate = " + BigDecimal.valueOf(Integer.valueOf(ACount).doubleValue()).divide(BigDecimal.valueOf(Integer.valueOf((ACount + BCount + CCount))), 2, RoundingMode.HALF_UP));
out.println("B rate = " + BigDecimal.valueOf(Integer.valueOf(BCount).doubleValue()).divide(BigDecimal.valueOf(Integer.valueOf((ACount + BCount + CCount))), 2, RoundingMode.HALF_UP));
out.println("C rate = " + BigDecimal.valueOf(Integer.valueOf(CCount).doubleValue()).divide(BigDecimal.valueOf(Integer.valueOf((ACount + BCount + CCount))), 2, RoundingMode.HALF_UP));
}
}
运行结果如下:
乱序前:[A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C]
乱序后:[A, B, B, B, B, C, B, C, C, A, C, C, C, A, C, C, C, B, B, C, A, C, C, A, C, B, B, A, C, A, A, B, C, C, B, A, B, C, C, B, C, A, C, B, C, C, B, C, C, C, C, A, C, C, B, C, C, A, B, B, B, C, C, C, C, B, B, B, C, C, C, C, C, C, C, A, B, C, C, B, C, C, C, A, A, B, B, A, A, C, A, A, B, A, B, C, C, B, B, C]
请输入随机次数:
100
随机次数=100
A rate = 0.24
B rate = 0.30
C rate = 0.46
请输入随机次数:
1000
随机次数=1000
A rate = 0.17
B rate = 0.32
C rate = 0.52
请输入随机次数:
100000
随机次数=100000
A rate = 0.20
B rate = 0.30
C rate = 0.50
请输入随机次数:
1000000
随机次数=1000000
A rate = 0.20
B rate = 0.30
C rate = 0.50
请输入随机次数:
可以发现,取值次数越多,比率越接近指定值。