当前位置:   article > 正文

JAVA 简单高效的金额随机分配 算法_java在限定的时间内随机生成订单,并且金额固定

java在限定的时间内随机生成订单,并且金额固定
  1. import java.util.ArrayList;
  2. import java.util.Collections;
  3. import java.util.List;
  4. import java.util.Random;
  5. public class SplitRedPacket {
  6. // 最小红包额度
  7. private static final int MINMONEY = 100;
  8. // 最大红包额度
  9. private static final int MAXMONEY = 900;
  10. /**
  11. * @Description: 随机拆分红包
  12. * @Author: liumeng
  13. * @Date: 2019/2/27
  14. * @Param: [money, count]
  15. * @Return: java.util.List<java.lang.Integer>
  16. **/
  17. public static List<Integer> splitRedPackets(int money, int count) {
  18. if(money < count*MINMONEY || money > count* MAXMONEY){
  19. System.out.println("不可拆分");
  20. return null;
  21. }
  22. // 先预留出 count 份 minS , 其余的做随机
  23. int moreMoney = money-count*MINMONEY;
  24. List<Integer> list = new ArrayList<Integer>();
  25. for(int i=0; i<count; i++){
  26. int one = random(moreMoney,count-i, MINMONEY, MAXMONEY);
  27. list.add(one+MINMONEY);
  28. moreMoney = moreMoney-one;
  29. }
  30. Collections.shuffle(list);
  31. return list;
  32. }
  33. /**
  34. * @Description: 随机红包数额(加上minS 为实际金额)
  35. * @Author: liumeng
  36. * @Date: 2019/2/27
  37. * @Param: [money, count]
  38. * @Return: java.util.List<java.lang.Integer>
  39. **/
  40. private static int random(int money, int count, int minS, int maxS) {
  41. // 红包数量为1,直接返回金额
  42. if (count == 1) {
  43. return money;
  44. }
  45. // 每次限定随机数值
  46. // 首先判断实际最小值
  47. int realMinS = money-(maxS-minS)*(count-1);
  48. int realRange ;
  49. // 如果存在实际最小值,则在实际最小值realMinS 和 maxS-minS 之间 random 数值
  50. if(realMinS > 0){
  51. realRange = maxS-minS-realMinS + 1;
  52. }
  53. // 如果不存在实际最小值(也就是说数值可以是minS)
  54. else{
  55. if(money > maxS-minS){
  56. realMinS = 0;
  57. realRange = maxS-minS + 1;
  58. }else{
  59. realMinS = 0;
  60. realRange = money + 1;
  61. }
  62. }
  63. return new Random().nextInt(realRange) + realMinS;
  64. }
  65. public static void main(String[] args) {
  66. int money = 2500 ;
  67. int count = 6;
  68. for(int i=0; i<7; i++) {
  69. List list = splitRedPackets(money, count);
  70. if (list != null) {
  71. System.out.println("随机拆分" + money + "拆分" + count + "份:" + list);
  72. }
  73. }
  74. }
  75. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/289213
推荐阅读
相关标签
  

闽ICP备14008679号