#次の列# Golangチュートリアル#は、Golangが二重平均アルゴリズムを実装し、赤い封筒をつかむ方法を紹介します。困っている友人に役立つことを願っています!
赤い封筒をつかむことは誰もがよく知っていますが、赤い封筒をつかむ方法について考えたことはありますか?
まず、要件と要件の制約を明確にする必要があります。赤い封筒には主に 3 つの制限があります
a. 獲得した総額 = 赤い封筒の総額、それ以上でもそれ以下でもありません
b. 最小値は 0.01 元、つまり全員が分け前を持ちます
c. 全員が掴み取る 受け取った赤い封筒の量はできるだけ平均化する必要があります
次に、この二重平均アルゴリズムを総額が M 元、N 人であると仮定すると、各掴みの量 = (0, (M/N) *2)、例えば、まだ先ほどの条件で、金額が100、人数が10、
最初の人が掴む金額は(0,20)です。正規分布の場合、掴む値は 10 程度のはずです。10 よりもはるかに低い確率が非常に高くなります。小さい場合、確率の合計も 10 より大きくなります。最初の人が掴んだ値は、 10;
2 人目の獲得金額は (0,90/9 *2)=(0,20) で、1 人目と同様に、2 人目の赤封筒の金額も 10; ##残りの人には # など。
使用されている手法である「WeChat Red Envelopes のアーキテクチャ設計」を確認しました。ただし、このアルゴリズムは完璧ではありません。最初の人が 15 を掴んだ場合、2 人目の範囲は (0,18.89) です。2 人目が高い値を掴むと、後続の人に悪影響を及ぼします。
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}
以上がGolang は二重平均アルゴリズムと赤い封筒を取得する方法を実装していますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。