|
@@ -1,7 +1,7 @@
|
|
package com.kioor.utils;
|
|
package com.kioor.utils;
|
|
|
|
|
|
import com.kioor.dto.Monster2GoodsDTO;
|
|
import com.kioor.dto.Monster2GoodsDTO;
|
|
-import com.github.javafaker.Faker;
|
|
|
|
|
|
+import org.springframework.stereotype.Component;
|
|
import java.math.BigDecimal;
|
|
import java.math.BigDecimal;
|
|
import java.util.*;
|
|
import java.util.*;
|
|
import java.util.concurrent.ThreadLocalRandom;
|
|
import java.util.concurrent.ThreadLocalRandom;
|
|
@@ -18,17 +18,31 @@ import java.util.concurrent.ThreadLocalRandom;
|
|
* @date 2023年07月26日
|
|
* @date 2023年07月26日
|
|
* @version: 1.0
|
|
* @version: 1.0
|
|
*/
|
|
*/
|
|
|
|
+@Component
|
|
public class RandomUtils {
|
|
public class RandomUtils {
|
|
- static Faker faker = new Faker(Locale.CHINA);
|
|
|
|
|
|
|
|
- private static final ThreadLocalRandom RANDOM =
|
|
|
|
- ThreadLocalRandom.current();
|
|
|
|
|
|
+ private static final ThreadLocalRandom RANDOM = ThreadLocalRandom.current();
|
|
|
|
+
|
|
|
|
+ ////////////////////////// ↓↓↓算法实现↓↓↓ ///////////////////////////
|
|
/**
|
|
/**
|
|
- * 怪物掉落物品计算(对象列表)
|
|
|
|
|
|
+ * 由概率随机是否触发
|
|
|
|
+ *
|
|
|
|
+ * @param chance 概率 0.000000 - 1.000000
|
|
|
|
+ * @return boolean
|
|
|
|
+ */
|
|
|
|
+ public final boolean isLuck(BigDecimal chance) {
|
|
|
|
+ int chanceInt = chance.multiply(new BigDecimal("1000000")).intValue();
|
|
|
|
+ int randomNum = RANDOM.nextInt(1000000);
|
|
|
|
+ return randomNum <= chanceInt;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ ///////////////////////// ↓↓↓业务相关↓↓↓ ////////////////////
|
|
|
|
+ /**
|
|
|
|
+ * 怪物掉落物品计算(对象列表)-无排斥随机,每一次对每一个对象随机概率都是公平的
|
|
* @param monster2GoodsDTOList 对象列表
|
|
* @param monster2GoodsDTOList 对象列表
|
|
* @return 筛选后的对象列表
|
|
* @return 筛选后的对象列表
|
|
*/
|
|
*/
|
|
- public static List<Monster2GoodsDTO> obtainGoods(List<Monster2GoodsDTO> monster2GoodsDTOList){
|
|
|
|
|
|
+ public List<Monster2GoodsDTO> obtainGoods(List<Monster2GoodsDTO> monster2GoodsDTOList){
|
|
List<Monster2GoodsDTO> backMonster2GoodsDTOList = new ArrayList<>();
|
|
List<Monster2GoodsDTO> backMonster2GoodsDTOList = new ArrayList<>();
|
|
for(Monster2GoodsDTO monster2GoodsDTO:monster2GoodsDTOList){
|
|
for(Monster2GoodsDTO monster2GoodsDTO:monster2GoodsDTOList){
|
|
if(isLuck(monster2GoodsDTO.getGoodsProb())){
|
|
if(isLuck(monster2GoodsDTO.getGoodsProb())){
|
|
@@ -40,11 +54,11 @@ public class RandomUtils {
|
|
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
- * 怪物掉落物品计算(数组)
|
|
|
|
|
|
+ * 怪物掉落物品计算(数组)-无排斥随机,每一次对每一个对象随机概率都是公平的
|
|
* @param propArr 将概率按照顺序放入数组
|
|
* @param propArr 将概率按照顺序放入数组
|
|
* @return 命中的数组下标
|
|
* @return 命中的数组下标
|
|
*/
|
|
*/
|
|
- public static int[] obtainGoods(BigDecimal[] propArr){
|
|
|
|
|
|
+ public int[] obtainGoods(BigDecimal[] propArr){
|
|
StringBuffer indexStr = new StringBuffer();
|
|
StringBuffer indexStr = new StringBuffer();
|
|
List<Monster2GoodsDTO> backMonster2GoodsDTOList = new ArrayList<>();
|
|
List<Monster2GoodsDTO> backMonster2GoodsDTOList = new ArrayList<>();
|
|
for(int i=0;i<propArr.length;i++){
|
|
for(int i=0;i<propArr.length;i++){
|
|
@@ -57,90 +71,4 @@ public class RandomUtils {
|
|
}
|
|
}
|
|
return Arrays.asList(indexStr.toString().split(",")).stream().mapToInt(Integer::parseInt).toArray();
|
|
return Arrays.asList(indexStr.toString().split(",")).stream().mapToInt(Integer::parseInt).toArray();
|
|
}
|
|
}
|
|
- /**
|
|
|
|
- * 由概率随机是否触发
|
|
|
|
- *
|
|
|
|
- * @param chance 0.000000 - 1.000000
|
|
|
|
- * @return boolean
|
|
|
|
- */
|
|
|
|
- public static final boolean isLuck(BigDecimal chance) {
|
|
|
|
- // chance = 50.0;// 测试:50%成功
|
|
|
|
- int chanceInt = chance.multiply(new BigDecimal("1000000")).intValue();
|
|
|
|
- int randomNum = RANDOM.nextInt(1000000);
|
|
|
|
- return randomNum <= chanceInt;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- public static void main(String[] args) {
|
|
|
|
-
|
|
|
|
- /**
|
|
|
|
- * 怪物掉落物品计算(对象列表)
|
|
|
|
- */
|
|
|
|
- List<Monster2GoodsDTO> monster2GoodsDTOList = new ArrayList<>();
|
|
|
|
-
|
|
|
|
- Monster2GoodsDTO monster2GoodsDTO1 = new Monster2GoodsDTO(1000000L,"金疮药",new BigDecimal("0.100000"));
|
|
|
|
- monster2GoodsDTOList.add(monster2GoodsDTO1);
|
|
|
|
-
|
|
|
|
- Monster2GoodsDTO monster2GoodsDTO2 = new Monster2GoodsDTO(1000001L,"柿饼",new BigDecimal("0.100000"));
|
|
|
|
- monster2GoodsDTOList.add(monster2GoodsDTO2);
|
|
|
|
-
|
|
|
|
- Monster2GoodsDTO monster2GoodsDTO3 = new Monster2GoodsDTO(2000000L,"青铜甲",new BigDecimal("0.010000"));
|
|
|
|
- monster2GoodsDTOList.add(monster2GoodsDTO3);
|
|
|
|
-
|
|
|
|
- Monster2GoodsDTO monster2GoodsDTO4 = new Monster2GoodsDTO(2000001L,"青铜盔",new BigDecimal("0.010000"));
|
|
|
|
- monster2GoodsDTOList.add(monster2GoodsDTO4);
|
|
|
|
-
|
|
|
|
- Monster2GoodsDTO monster2GoodsDTO5 = new Monster2GoodsDTO(2000002L,"青铜靴",new BigDecimal("0.010000"));
|
|
|
|
- monster2GoodsDTOList.add(monster2GoodsDTO5);
|
|
|
|
-
|
|
|
|
- Monster2GoodsDTO monster2GoodsDTO6 = new Monster2GoodsDTO(2000003L,"青铜戒",new BigDecimal("0.010000"));
|
|
|
|
- monster2GoodsDTOList.add(monster2GoodsDTO6);
|
|
|
|
-
|
|
|
|
- Monster2GoodsDTO monster2GoodsDTO7 = new Monster2GoodsDTO(2000004L,"青铜镯",new BigDecimal("0.910000"));
|
|
|
|
- monster2GoodsDTOList.add(monster2GoodsDTO7);
|
|
|
|
-
|
|
|
|
- Monster2GoodsDTO monster2GoodsDTO8 = new Monster2GoodsDTO(2000005L,"青铜项链",new BigDecimal("0.010000"));
|
|
|
|
- monster2GoodsDTOList.add(monster2GoodsDTO8);
|
|
|
|
-
|
|
|
|
- Monster2GoodsDTO monster2GoodsDTO9 = new Monster2GoodsDTO(2000006L,"青铜剑",new BigDecimal("0.010000"));
|
|
|
|
- monster2GoodsDTOList.add(monster2GoodsDTO9);
|
|
|
|
-
|
|
|
|
- Monster2GoodsDTO monster2GoodsDTO10 = new Monster2GoodsDTO(2000007L,"青铜棍",new BigDecimal("0.010000"));
|
|
|
|
- monster2GoodsDTOList.add(monster2GoodsDTO10);
|
|
|
|
-
|
|
|
|
- Monster2GoodsDTO monster2GoodsDTO11 = new Monster2GoodsDTO(2000008L,"青铜刀",new BigDecimal("0.010000"));
|
|
|
|
- monster2GoodsDTOList.add(monster2GoodsDTO11);
|
|
|
|
-
|
|
|
|
-// //单次测试
|
|
|
|
-// List<Monster2GoodsDTO> backMonster2GoodsDTOList1 = obtainGoods(monster2GoodsDTOList);
|
|
|
|
-// for(Monster2GoodsDTO backMonster2GoodsDTO:backMonster2GoodsDTOList1) {
|
|
|
|
-// System.out.println(backMonster2GoodsDTO.getGoodsName());
|
|
|
|
-// }
|
|
|
|
-
|
|
|
|
- //批量测试
|
|
|
|
-// int count = 100;
|
|
|
|
-// Map<String,Integer> result = new HashMap<>();
|
|
|
|
-// for(int i=0;i<count;i++) {
|
|
|
|
-// List<Monster2GoodsDTO> backMonster2GoodsDTOList = obtainGoods(monster2GoodsDTOList);
|
|
|
|
-// for(Monster2GoodsDTO backMonster2GoodsDTO:backMonster2GoodsDTOList){
|
|
|
|
-// if(result.containsKey(backMonster2GoodsDTO.getGoodsName())){
|
|
|
|
-// result.put(backMonster2GoodsDTO.getGoodsName(),result.get(backMonster2GoodsDTO.getGoodsName())+1);
|
|
|
|
-// }else {
|
|
|
|
-// result.put(backMonster2GoodsDTO.getGoodsName(),1);
|
|
|
|
-// }
|
|
|
|
-// }
|
|
|
|
-// }
|
|
|
|
-// result.forEach((key,value)->{
|
|
|
|
-// System.out.println(key+":"+value);
|
|
|
|
-// });
|
|
|
|
-
|
|
|
|
- /**
|
|
|
|
- * 怪物掉落物品计算(数组)
|
|
|
|
- */
|
|
|
|
- BigDecimal[] propArr = new BigDecimal[monster2GoodsDTOList.size()];
|
|
|
|
- for(int i=0;i<monster2GoodsDTOList.size();i++){
|
|
|
|
- propArr[i] = monster2GoodsDTOList.get(i).getGoodsProb();
|
|
|
|
- }
|
|
|
|
- int[] resultIndex = obtainGoods(propArr);
|
|
|
|
- System.out.println(Arrays.toString(resultIndex));
|
|
|
|
- }
|
|
|
|
}
|
|
}
|