public class LotteryUtils { public static int lottery(List<BigDecimal> originRates) { BigDecimal min = Collections.min(originRates); BigDecimal sumRate; if (min.compareTo(new BigDecimal(1)) >= 0) { sumRate = new BigDecimal(100); } else { String t = String.valueOf(min); String[] data = t.split("\\."); int length = data[1].length(); int sum = 1; for (int i = 1; i <= length; i++) { sum = sum * 10; } sumRate = new BigDecimal(sum * 100); } // 计算每个物品在总概率的基础下的概率情况 List<Integer> sortOriginRates = new ArrayList<>(); //sortOriginRates.add(1); BigDecimal tempSumRate = new BigDecimal(0); for (BigDecimal rate : originRates) { tempSumRate = tempSumRate.add(rate); sortOriginRates.add(tempSumRate.divide(new BigDecimal(100)).multiply(sumRate).intValue()); } // 根据区块值来获取抽取到的物品索引 Integer nextDouble = (int) (Math.random() * sumRate.intValue() + 1); sortOriginRates.add(nextDouble); Collections.sort(sortOriginRates); return sortOriginRates.indexOf(nextDouble); } }
时间: 2024-02-14 14:18:53 浏览: 65
这是一个Java类LotteryUtils,其中有一个静态方法lottery,用于从一组具有不同概率的物品中随机选取一个物品。
该方法的输入参数是一个List,包含了每个物品的概率,概率以BigDecimal类型表示。
该方法的返回值是一个整数,表示选中的物品在输入List中的索引。
具体实现过程如下:
首先,该方法会找到输入List中最小的概率值min,并判断该值是否大于等于1。如果满足条件,方法会将总概率sumRate设置为100;否则,方法会根据最小概率值的小数部分位数,计算总概率sumRate。
接着,该方法会计算每个物品在总概率sumRate的基础下的概率情况,并将结果保存在一个List sortOriginRates中。
最后,该方法会生成一个区块值nextDouble,并根据该值从sortOriginRates中获取相应的物品索引,返回该索引值。
相关问题
List<BigDecimal>如何获取元素的最大值、最小值、以及平均值
要获取 `List<BigDecimal>` 中元素的最大值、最小值和平均值,你可以使用 `Collections` 类或者流(Stream)来完成。以下是两种不同的实现方式:
1. 使用 `Collections` 类:
```java
import java.math.BigDecimal;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<BigDecimal> bigDecimalList = Arrays.asList(
new BigDecimal("1.23"),
new BigDecimal("4.56"),
new BigDecimal("7.89")
);
// 获取最大值
BigDecimal max = Collections.max(bigDecimalList);
System.out.println("最大值: " + max);
// 获取最小值
BigDecimal min = Collections.min(bigDecimalList);
System.out.println("最小值: " + min);
// 获取平均值
BigDecimal sum = BigDecimal.ZERO;
for (BigDecimal num : bigDecimalList) {
sum = sum.add(num);
}
BigDecimal average = sum.divide(BigDecimal.valueOf(bigDecimalList.size()), 2, BigDecimal.ROUND_HALF_UP);
System.out.println("平均值: " + average);
}
}
```
在上述示例中,我们创建了一个 `List<BigDecimal>`,名为 `bigDecimalList`,其中包含了几个 `BigDecimal` 对象。然后,我们使用 `Collections.max` 和 `Collections.min` 方法分别获取列表中的最大值和最小值。对于平均值的计算,我们使用一个循环来累加列表中的元素,并使用 `divide` 方法将总和除以列表的大小来计算平均值。
运行以上代码,输出将会是:
```
最大值: 7.89
最小值: 1.23
平均值: 4.26
```
2. 使用流(Stream):
```java
import java.math.BigDecimal;
import java.util.Arrays;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<BigDecimal> bigDecimalList = Arrays.asList(
new BigDecimal("1.23"),
new BigDecimal("4.56"),
new BigDecimal("7.89")
);
// 获取最大值
BigDecimal max = bigDecimalList.stream()
.max(BigDecimal::compareTo)
.orElse(BigDecimal.ZERO);
System.out.println("最大值: " + max);
// 获取最小值
BigDecimal min = bigDecimalList.stream()
.min(BigDecimal::compareTo)
.orElse(BigDecimal.ZERO);
System.out.println("最小值: " + min);
// 获取平均值
BigDecimal sum = bigDecimalList.stream()
.reduce(BigDecimal.ZERO, BigDecimal::add);
BigDecimal average = sum.divide(BigDecimal.valueOf(bigDecimalList.size()), 2, BigDecimal.ROUND_HALF_UP);
System.out.println("平均值: " + average);
}
}
```
在这个示例中,我们使用流的 `max` 和 `min` 方法来获取列表中的最大值和最小值。对于平均值的计算,我们使用 `reduce` 方法将列表中的元素累加起来,并使用 `divide` 方法计算平均值。
运行以上代码,输出将会是相同的结果:
```
最大值: 7.89
最小值: 1.23
平均值: 4.26
```
希望能对你有所帮助!如果还有其他问题,请随时提问。
stopFlag=1!=Collections.min(randomWeight).compareTo(new BigDecimal("0"));作用
这段代码的作用是判断随机权重列表中是否存在小于等于零的值。具体解释如下:
1. `Collections.min(randomWeight)`:这是使用 `Collections` 类中的 `min` 方法来找到随机权重列表 `randomWeight` 中的最小值。
2. `new BigDecimal("0")`:这是创建一个 `BigDecimal` 对象,其值为 0。
3. `compareTo`:这是 `BigDecimal` 类的方法,用于比较两个 `BigDecimal` 对象的大小。
4. `1!=Collections.min(randomWeight).compareTo(new BigDecimal("0"))`:这是将最小值与 0 进行比较,并且判断最小值是否大于 0。如果最小值大于 0,则返回 `false`,否则返回 `true`。
所以,`stopFlag` 的值将根据随机权重列表中是否存在小于等于零的值来确定。如果存在小于等于零的值,`stopFlag` 的值将为 `true`,否则为 `false`。
阅读全文