微信红包算法遐想

 private final AtomicLong seed;

    private static final long multiplier = 0x5DEECE66DL;
    private static final long addend = 0xBL;
    private static final long mask = (1L << 48) - 1;

    /**
     * Creates a new random number generator. This constructor sets
     * the seed of the random number generator to a value very likely
     * to be distinct from any other invocation of this constructor.
     */
    public Random() {
        this(seedUniquifier() ^ System.nanoTime());
    }

闲来无事,想如果自己设计微信红包,怎么设计呢? 


因为我不是微信红包的开发人员,所以以下内容纯属虚构 


先说下我的算法,每人随机一个数,然后把所有人的加起来成为分母,每个人的数是分子,分子除以分母,就是这个人占用红包的额度。


直接看代码

public class Haobao {

	public static List buildFen(int fen,int i){
		if(fen<=i){
			return null;
		}
		List ins=new ArrayList(i);
		List cns=new ArrayList(i);
//		Random r=ThreadLocalRandom.current();
		Random r=new Random();
		int total=0;
		for(int j=0;j s=buildFen(2245, 100);
//				System.out.println(s.toString());
			}
			System.out.println("time:"+(System.currentTimeMillis()-begin));
		}
		
	}
}

Random VS  ThreadLocalRandom 

有人说ThreadLocalRandom 性能比Random高,有人说Random线程不安全。


今天就看下源码,本人看的是JDK 1.7的


先看Random的,关键是seed因子 

 private final AtomicLong seed;

    private static final long multiplier = 0x5DEECE66DL;
    private static final long addend = 0xBL;
    private static final long mask = (1L << 48) - 1;

    /**
     * Creates a new random number generator. This constructor sets
     * the seed of the random number generator to a value very likely
     * to be distinct from any other invocation of this constructor.
     */
    public Random() {
        this(seedUniquifier() ^ System.nanoTime());
    }


再看下ThreadLocalRandom ,首先ThreadLocalRandom 继承了Random,仔细看接口,一些方法都是重用父类的。


用TheadLocal 实现的线程安全。


    private static final ThreadLocal localRandom =
        new ThreadLocal() {
            protected ThreadLocalRandom initialValue() {
                return new ThreadLocalRandom();
            }
    };





你可能感兴趣的:(java)