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 19:18:53 浏览: 68
这是一个Java类LotteryUtils,其中有一个静态方法lottery,用于从一组具有不同概率的物品中随机选取一个物品。
该方法的输入参数是一个List,包含了每个物品的概率,概率以BigDecimal类型表示。
该方法的返回值是一个整数,表示选中的物品在输入List中的索引。
具体实现过程如下:
首先,该方法会找到输入List中最小的概率值min,并判断该值是否大于等于1。如果满足条件,方法会将总概率sumRate设置为100;否则,方法会根据最小概率值的小数部分位数,计算总概率sumRate。
接着,该方法会计算每个物品在总概率sumRate的基础下的概率情况,并将结果保存在一个List sortOriginRates中。
最后,该方法会生成一个区块值nextDouble,并根据该值从sortOriginRates中获取相应的物品索引,返回该索引值。
相关问题
List<BigDecimal> minPrice 获取最小值
在Java中,如果你有一个`List<BigDecimal>`类型的列表,你想获取其中的最小值,你可以使用`Collections.min()`方法结合lambda表达式。这个方法返回列表中的最小元素。如果没有明确指定比较规则,它默认按照`Comparable`接口进行自然排序。以下是示例:
```java
import java.util.List;
import java.util.Collections;
List<BigDecimal> minPrice = ... // 这里是你的BigDecimal列表
// 获取最小值
BigDecimal min = Collections.min(minPrice);
System.out.println("最小价格是: " + min);
```
如果你想确保在并行计算环境中也能得到正确的结果,可以在操作前先对列表进行排序:
```java
import java.util.Comparator;
import java.util.stream.Collectors;
List<BigDecimal> sortedMinPrice = minPrice.stream()
.sorted(Comparator.naturalOrder())
.collect(Collectors.toList());
BigDecimal min = sortedMinPrice.get(0); // 由于已经排序,第一个就是最小的
System.out.println("最小价格是: " + min);
```
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
```
希望能对你有所帮助!如果还有其他问题,请随时提问。
阅读全文