风也温柔

计算机科学知识库

java红包分配算法代码-微信红包金额生成算法---线段切割法

  微信红包首先将金额M元按照要发的人数N分成随机的N个金额不等的红包份额。生成N个份之后java红包分配算法代码,用户请求到了就将1份红包发个用户。

  java实现银行家算法代码_java红包分配算法代码_银行家算法java代码

  生成红包金额数的算法采用线段切割法:将金额看成一条线段java红包分配算法代码-微信红包金额生成算法---线段切割法,线段的长度范围是0到M100,首先需要生成1~(M100-1) 中间的(N-1)个随机的且不重复的数,可以使用这(N-1)个数去切割线段java红包分配算法代码,切割后的每一份就是红包的金额数。

  java红包分配算法代码_java实现银行家算法代码_银行家算法java代码

  具体代码实现如下:

  java红包分配算法代码_银行家算法java代码_java实现银行家算法代码

  <pre class="java" name="code">
import java.math.BigDecimal;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.*;
/**

  • 微信红包首先将金额M元按照要发的人数N分成随机的N个金额不等的红包份额。生成N个份之后,用户请求到了就将1份红包发个用户
  • 生成红包金额数的算法采用线段切割法:将金额看成一条线段,线段的长度范围是0到M100,首先需要生成1~(M100-1)
  • 中间的(N-1)个随机的且不重复的数,可以使用这(N-1)个数去切割线段,切割后的每一份就是红包的金额数。
    */

public class Main {

/**
 * @param args
 */
public static void main(String[] args) {
    exe(200,5);
}
/**
 *
 * @param amount 红包金额
 * @param friend 发出的红包数
 */
private static void exe(int amount,int friend){
    int seed = 100 * amount;//将金额数按照一分钱来等分100*amount分
    int length  = 0;
    int m_length = friend-1;//在0~seed中生成m_length个随机不重复的数字
    //利用SecureRandom生成随机数
    SecureRandom secureRandom = null;
    //保证不重复且升序排序
    SortedSet set = new TreeSet();
    try {
        secureRandom = SecureRandom.getInstance("SHA1PRNG");
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    }
    while (length < m_length){
        int num = secureRandom.nextInt(seed);
        if(num == 0) num = 1;
        set.add(num);
        length = set.size();
    }
    int preNum = 0;
    int currentNum = 0;
    int calc = 0;
    for (int i = 0; i < set.toArray().length+1 ; i++) {
        if (i < set.toArray().length){
            currentNum = (int)set.toArray()[i];
        }else {
            currentNum = seed;
        }
        System.out.println("第" +(i+1) +"个红包");
        System.out.println("红包金额=" + new BigDecimal((currentNum - preNum)).divide(new BigDecimal(100)) + "元");
        calc += (currentNum - preNum);
        System.out.println("已发:" +new BigDecimal(calc).divide(new BigDecimal(100)) + "元");
        preNum = currentNum;
    }
}

}
</pre>

  文章来源:https://www.iteye.com/blog/falseking-2424879