Maison  >  Article  >  développement back-end  >  Golang implémente l'algorithme à double moyenne et la méthode de récupération des enveloppes rouges

Golang implémente l'algorithme à double moyenne et la méthode de récupération des enveloppes rouges

藏色散人
藏色散人avant
2020-08-15 13:08:193937parcourir
Vous trouverez ci-dessous

Tutoriel Golang colonne pour vous présenter la méthode de mise en œuvre de l'algorithme de valeur et de récupération des enveloppes rouges. J'espère que cela sera utile aux amis dans le besoin !

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 ?

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

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,
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
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

golang

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer