100块钱随机发红包,怎样才能公平
假设剩余红包金额m元,剩余人数n人。那么有如下公式
每次抢到的金额=随机区间[0.01,m/n2-0.01]元
举个例子
100/52=40元。 所以第一个人抢到的金额范围在0.01-39.99元。
第二个人 80/4*2 所以第二个人抢到的金额范围在0.01-39.99元
所以,每个人抢到的范围均值是相等的
// DoubleAverage 二倍均值算法 func DoubleAverage(count, amount int64) int64 { if count == 1 { return amount } //计算出最大可用金额 max := amount - min*count //计算最大可用平均值 avg := max / count //二倍均值基础在加上最小金额 防止出现0值 avg2 := 2*avg + min //随机红包金额序列元素,把二倍均值作为随机的最大数 rand.Seed(time.Now().UnixNano()) randNum := rand.Int63n(avg2) x := randNum + min fmt.Printf("剩余人数:%d\t抢到:%.2f \t剩余金额:%.2f\t本次均值的二倍:%.2f\t金额随机范围:[%0.2f, %.2f]\n", count, float64(x)/100, float64(amount-x)/100, float64(avg2)/100, float64(min)/100, float64(randNum)/100) return x }
运行结果: