Maison > Article > développement back-end > Golang implémente l'algorithme à double moyenne et la méthode de récupération des enveloppes rouges
Tout le monde est certainement familier avec la saisie des enveloppes rouges, mais avez-vous déjà réfléchi à la façon de saisir les enveloppes rouges ?Supposons que le montant total soit de M yuans, N personnes, le montant de chaque saisie = (0 , (M/N) *2), par exemple, ou Les conditions mentionnées précédemment, le montant est de 100, le nombre de personnes est de 10,Tout d'abord, nous devons clarifier les exigences et les contraintes des exigences. Il existe trois restrictions principales sur les enveloppes rouges
a Le montant total saisi = le montant total des enveloppes rouges, ni plus ni moins
b La valeur minimale est de 0,01 yuan, c'est-à-dire que chacun a une partc. Tout le monde saisit Le montant des enveloppes rouges reçues doit être calculé en moyenne autant que possible
le montant que la première personne saisit est (0,20), la valeur saisi, selon la distribution normale, devrait être d'environ 10, la probabilité d'être bien inférieure à 10 est très élevée Petit, la somme des probabilités est également bien supérieure à 10. On suppose que la valeur que la première personne saisit est de 10 ;le montant que la deuxième personne récupère est (0,90/9 *2)=(0,20) , le même que celui de la première personne, le montant de l'enveloppe rouge de la deuxième personne doit également être d'environ 10
golang
et ainsi de suite pour les personnes restantes.
J'ai recherché "Conception architecturale des enveloppes rouges WeChat", et cette méthode y est utilisée. Cependant, cet algorithme n'est pas parfait. Si la première personne saisit 15, la portée de la deuxième personne est de (0,18,89). Si la deuxième personne saisit une valeur élevée, cela sera préjudiciable aux personnes derrière
Voyons ensuite comment implémenter cet algorithme à double moyenne dans
package mainimport ( "fmt" "math/rand" "time")func main() { //10个人 抢10000分 也就是10个人抢100块钱 count,amount := int64(10),int64(10000) remain := amount sum := int64(0) for i := int64(0);i<count;i++ { x := DoubleAverage(count-i, remain) remain -= x sum += x fmt.Println(i+1,"=",float64(x)/float64(100),", ") } fmt.Println() fmt.Println("总和是:",sum)}//提前定义能抢到的最小金额1分var min int64 = 1//二倍均值算法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()) x := rand.Int63n(avg2) + min return x}Regardez les résultats :
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!