美文网首页
抢红包算法(随机数)

抢红包算法(随机数)

作者: 小幸运Q | 来源:发表于2021-05-13 12:52 被阅读0次

公平法

红包剩余金额为 M
红包剩余数量为 N

这种算法就是每次都在区间[0,M/N×2] 随机取一个数。假设100元红包发10个人,那么合理的做法应该是每个人领到10元的概率相同。

  • 第一个人随机金额的范围为[0,100/10×2] ,也就是[0,20],这样平均可以领到10元,此时剩余金额为100-10=90。
  • 第二个人随机金额的范围为[0,90/9×2] ,也就是[0,20],这样平均也可以领到10元,此时剩余金额为90-10=80。
  • 第三个人随机金额的范围为[0,80/8×2] ,也就是[0,20],这样平均也可以领到10元。
  • 第N个人拿到剩余的金额,不需要随机数。

这样推导下去,每个人领到相同金额的概率应该就是相同的了。

  • 注意:这种方法有溢出风险,可能最后分配的变成负数也不是不可以。

我的解决思路:

第一次生成随机数:k1=(0,sum/n*2) (左开右开区间内的随机数)
第二次生成随机数:k2 = (0,(sum-k1)/(n-1)*2)
第三次生成随机数:k3 = (0,(sum-k1-k2)/(n-2)*2)
第N次生成随机数:kn = sum-k1-...-kn-1

import random
import numpy as np
def getredpocket(sums,n):
    minnum=0.000000001
    # 避免出现0的极端小概率情况
    return random.uniform(minnum,(sums/n)*2-minnum)

def run(sums,n):
    s=[]
    for i in range(n,1,-1):
        red=getredpocket(sums,i)
        sums-=red
        s.append(red)
    s.append(sums)
    for i in s:
        if i<=0:
            print("fuck!!!!")
            # 只要有负数或者0就会在sum函数报错从而发现程序问题
            return "fuck!!!!"
    return s
terms=10000
sums=1000000
n=10000
for i in range(terms):
    r=run(sums,n)
    print("No."+str(i+1)+" terms:")
    print("u:",sum(r)/n,end="   ")
    print("σ:",np.var(r))
    print()
1万人抢100万元红包效果

线段切割法

这个算法可以把总金额想象成一条线段,每个人都有机会切一刀,前面的人切剩下的后面的人再接着切,这样越是前面的人截取的长度(理解成领取到的红包金额)越大的概率就越大。

相关文章

  • 抢红包算法(随机数)

    公平法 红包剩余金额为 M红包剩余数量为 N 这种算法就是每次都在区间[0,M/N×2] 随机取一个数。假设100...

  • python随机数生成算法

    python随机数生成算法# 现在程序中用的随机数,都是伪随机数算法生成的。例如线性同余法,平方取中法等。 1.梅...

  • 一些比较好的技术资料

    随机数 随机数都是骗人的 缓存 算法 设计 大数据 编程语言

  • Swift 随机数生成

    // 随机数生成 // arc4random 随机数算法 let dicFaceCount = 6 let ran...

  • 尝试写一个抢红包算法

    抢红包算法看似简单,实际还是不简单啊!

  • Python 随机数标准库(2) -- shuffle()

    Python random包可以用来生成随机数。随机数不仅可以用于数学用途,还经常被嵌入到算法中,用以提高算法效率...

  • Python 随机数标准库(1) -- random()

    Python random包可以用来生成随机数。随机数不仅可以用于数学用途,还经常被嵌入到算法中,用以提高算法效率...

  • MT19937 随机算法实现

    Mersenne Twister 算法译为马特赛特旋转演算法,是伪随机数发生器之一,其主要作用是生成伪随机数。此算...

  • 抢红包算法

    抢红包大家都知道,但发出一个固定金额的红包,由若干个人来抢,需要满足哪些规则? 所有人抢到金额之和等于红包金额,不...

  • 抢红包算法

    今天分享一篇有趣的抢红包算法,基本原理就是“二倍均值”,简单说,也就是一个公式,在这里,令P为人数,M为红包总金额...

网友评论

      本文标题:抢红包算法(随机数)

      本文链接:https://www.haomeiwen.com/subject/bnewrltx.html