0%

go二均值抢红包算法

微信抢红包算法—–go语言实现

主要使用Rand随机+二均值方法实现

func main() {	
	count, money := 10, 200
	//红包总和 验证发了多少钱
	sum := 0
	//发红包
	for i := 0; i < count; i++ {
		x := SecAvg(count-i, money)
		//剩余钱
		money -= x
		//发了多少钱
		sum += x
		//领红包数
		fmt.Println("第", i+1, "个人领了", x, "元")
	}
	fmt.Println("一共发了", sum, "元")
}
func SecAvg(count, money int) int {
	//红包最小值
	min := 1
	if count == 1 {
		return money
	}
	//二均值法 (0,(剩余钱/剩余人数)*2)==[min,max/count * 2]
	//上边界 左开右开 避免为0
	max := money - min
	right := (max/count)*2 + min
	rand.Seed(time.Now().UnixNano())
	//[min,max/count * 2]
	x := rand.Intn(right) + min
	return x
}
/*
第 1 个人领了 24 元
第 2 个人领了 24 元
第 3 个人领了 26 元
第 4 个人领了 15 元
第 5 个人领了 36 元
第 6 个人领了 20 元
第 7 个人领了 20 元
第 8 个人领了 17 元
第 9 个人领了 17 元
第 10 个人领了 1 元
一共发了 200 元
*/

红包到小数点后两位

	count, money := 10, 200//200为2元 定钱需要 *100
	//红包总和 验证发了多少钱
	sum := float32(0)
	//发红包
	for i := 0; i < count; i++ {
		x := SecAvg(count-i, money)
		//剩余钱
		money -= x
		//发了多少钱
		sum += float32(x)
		//领红包数
		fmt.Println("第", i+1, "个人领了", float32(x)/float32(100), "元")
	}
	fmt.Println("一共发了", sum/float32(100), "元")

/*
第 1 个人领了 0.2 元
第 2 个人领了 0.24 元
第 3 个人领了 0.24 元
第 4 个人领了 0.27 元
第 5 个人领了 0.26 元
第 6 个人领了 0.26 元
第 7 个人领了 0.18 元
第 8 个人领了 0.1 元 
第 9 个人领了 0.06 元
第 10 个人领了 0.19 元
一共发了 2 元
*/
-------------本文结束感谢您的阅读-------------
打赏一瓶矿泉水