فهرست منبع

增加测试类

tangbin 1 سال پیش
والد
کامیت
058cf1e2f3

+ 0 - 6
kioor-api/pom.xml

@@ -15,12 +15,6 @@
 			<artifactId>kioor-common</artifactId>
 			<version>3.7.0</version>
 		</dependency>
-		<!-- https://mvnrepository.com/artifact/com.github.javafaker/javafaker -->
-		<dependency>
-			<groupId>com.github.javafaker</groupId>
-			<artifactId>javafaker</artifactId>
-			<version>1.0.2</version>
-		</dependency>
 	</dependencies>
 
 	<build>

+ 0 - 1
kioor-api/src/main/java/com/kioor/dto/Monster2GoodsDTO.java

@@ -17,7 +17,6 @@ import java.math.BigDecimal;
 /**
  * 怪物掉落物品
  *
- * @author Mark sunlightcs@gmail.com
  */
 @Data
 @ApiModel(value = "怪物掉落物品")

+ 22 - 94
kioor-api/src/main/java/com/kioor/utils/RandomUtils.java

@@ -1,7 +1,7 @@
 package com.kioor.utils;
 
 import com.kioor.dto.Monster2GoodsDTO;
-import com.github.javafaker.Faker;
+import org.springframework.stereotype.Component;
 import java.math.BigDecimal;
 import java.util.*;
 import java.util.concurrent.ThreadLocalRandom;
@@ -18,17 +18,31 @@ import java.util.concurrent.ThreadLocalRandom;
  * @date 2023年07月26日
  * @version: 1.0
  */
+@Component
 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 对象列表
      * @return 筛选后的对象列表
      */
-    public static List<Monster2GoodsDTO> obtainGoods(List<Monster2GoodsDTO> monster2GoodsDTOList){
+    public List<Monster2GoodsDTO> obtainGoods(List<Monster2GoodsDTO> monster2GoodsDTOList){
         List<Monster2GoodsDTO> backMonster2GoodsDTOList = new ArrayList<>();
         for(Monster2GoodsDTO monster2GoodsDTO:monster2GoodsDTOList){
             if(isLuck(monster2GoodsDTO.getGoodsProb())){
@@ -40,11 +54,11 @@ public class RandomUtils {
 
 
     /**
-     * 怪物掉落物品计算(数组)
+     * 怪物掉落物品计算(数组)-无排斥随机,每一次对每一个对象随机概率都是公平的
      * @param propArr 将概率按照顺序放入数组
      * @return 命中的数组下标
      */
-    public static int[] obtainGoods(BigDecimal[] propArr){
+    public int[] obtainGoods(BigDecimal[] propArr){
         StringBuffer indexStr = new StringBuffer();
         List<Monster2GoodsDTO> backMonster2GoodsDTOList = new ArrayList<>();
         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();
     }
-    /**
-     * 由概率随机是否触发
-     *
-     * @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));
-    }
 }

+ 2 - 2
kioor-api/src/main/resources/application-dev.yml

@@ -2,8 +2,8 @@ spring:
   datasource:
     druid:
       driver-class-name: com.mysql.cj.jdbc.Driver
-      url: jdbc:mysql://localhost:3306/security_enterprise?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
-      username: kioor
+      url: jdbc:mysql://localhost:3306/iogame_test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
+      username: root
       password: 123456
       initial-size: 10
       max-active: 100

+ 114 - 0
kioor-api/src/test/java/com.kioor/utils/RandomUtilsTest.java

@@ -0,0 +1,114 @@
+package com.kioor.utils;
+
+import com.kioor.dto.Monster2GoodsDTO;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import java.math.BigDecimal;
+import java.util.*;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+public class RandomUtilsTest {
+    @Autowired
+    private RandomUtils randomUtils;
+
+    /**
+     * 模拟一个带概率的物品列表
+     * @return
+     */
+    private List<Monster2GoodsDTO> getMonster2GoodsDTOList(){
+        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.010000"));
+        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);
+
+        return monster2GoodsDTOList;
+    }
+
+    /**
+     * 单次测试怪物掉落物品(传入对象列表)
+     */
+    @Test
+    public void singleMonster2Goods() {
+        //获取模拟的物品数据列表
+        List<Monster2GoodsDTO> monster2GoodsDTOList = getMonster2GoodsDTOList();
+        List<Monster2GoodsDTO> backMonster2GoodsDTOList1 = randomUtils.obtainGoods(monster2GoodsDTOList);
+        for(Monster2GoodsDTO backMonster2GoodsDTO:backMonster2GoodsDTOList1) {
+            System.out.println(backMonster2GoodsDTO.getGoodsName());
+        }
+    }
+    /**
+     * 批量测试怪物掉落物品(传入对象列表)
+     */
+    @Test
+    public void batchMonster2Goods() {
+        //获取模拟的物品数据列表
+        List<Monster2GoodsDTO> monster2GoodsDTOList = getMonster2GoodsDTOList();
+        int count = 1000000;
+        Map<String,Integer> result = new HashMap<>();
+        for(int i=0;i<count;i++) {
+            List<Monster2GoodsDTO> backMonster2GoodsDTOList = randomUtils.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);
+        });
+    }
+
+
+    /**
+     * 单次测试怪物掉落物品(传入概率数组)
+     */
+    @Test
+    public void singleArrMonster2Goods() {
+        //获取模拟的物品数据列表
+        List<Monster2GoodsDTO> monster2GoodsDTOList = getMonster2GoodsDTOList();
+        BigDecimal[] propArr = new BigDecimal[monster2GoodsDTOList.size()];
+        for(int i=0;i<monster2GoodsDTOList.size();i++){
+            propArr[i] = monster2GoodsDTOList.get(i).getGoodsProb();
+        }
+        int[] resultIndex = randomUtils.obtainGoods(propArr);
+        System.out.println(Arrays.toString(resultIndex));
+    }
+
+}

+ 0 - 6
pom.xml

@@ -195,12 +195,6 @@
             <artifactId>lombok</artifactId>
             <version>${lombok.version}</version>
         </dependency>
-        <!-- 演示用的假数据 https://mvnrepository.com/artifact/com.github.javafaker/javafaker -->
-        <dependency>
-            <groupId>com.github.javafaker</groupId>
-            <artifactId>javafaker</artifactId>
-            <version>1.0.2</version>
-        </dependency>
     </dependencies>
 
     <!-- 阿里云maven仓库 -->