V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
z21victor
V2EX  ›  PHP

学习记录--微信红包

  •  
  •   z21victor · 2016-07-05 16:38:21 +08:00 · 3584 次点击
    这是一个创建于 3068 天前的主题,其中的信息可能已经有所发展或是发生改变。

    好久之前写的了,太懒了。 不管水平如何都要记录一下,哎! 看了 timyang 的文章,有感而发。

    $total=20;

    $num=16;

    $min=0.01;

    for ($i=1;$i<$num;$i++){

    $n = $num-$i+1;
    
    $newTotal = ($total/$n)*2;
    
    $money = mt_rand($min*100,$newTotal*100)/100;
    
    $total = $total-$money;
    
    echo '第'.$i.'个:'.$money.' 元,剩余:'.$total.' 元 <br/>';
    

    }

    echo '第'.$num.'个:'.$total.' 元,剩余: 0 元';

    第 1 条附言  ·  2016-07-06 08:54:05 +08:00
    本身大家都是猜想,都不能确定对错,除非微信公开。我这么写,是因为看到 timyang 博文中“每次拆红包时,系统取 0.01 到剩余平均值*2 之间作为红包的金额。”这句话。

    回帖中 guoer 提示:记录不是让我发帖。受教了,本来就是找个地方方便以后回看,那我就换个地方记录。

    打扰见谅!
    13 条回复    2016-07-06 08:56:23 +08:00
    ersic
        1
    ersic  
       2016-07-05 16:57:23 +08:00
    假如,一百块钱的红包十个人分,最优只能是二十呗?
    微信好像不是这样的。
    z21victor
        2
    z21victor  
    OP
       2016-07-05 16:58:53 +08:00
    @ersic 随机生成,符合正态分布,但是最后一个红包会大概率大点
    madao
        3
    madao  
       2016-07-05 17:02:17 +08:00
    不符合,应该是这样,假设最小可得的值为 x 人数为 n 总钱数为 a

    第一个则为 rand(a-(n*x)) 得到 r1
    第二个则为 rand(a-r1-((n-1)*x))

    这样事实上期望值是差不多的(违反直觉对吧)。
    z21victor
        4
    z21victor  
    OP
       2016-07-05 17:02:46 +08:00
    @ersic 我知道你的意思了,我这边说每次的红包金额是,最大是每人可分钱的平均数乘以 2 ,最小是 0.01 。在这区间去随机。
    madao
        5
    madao  
       2016-07-05 17:03:41 +08:00
    这个实际讨论很多: https://www.zhihu.com/question/22625187
    z21victor
        6
    z21victor  
    OP
       2016-07-05 17:04:47 +08:00
    @madao 这个我也是猜测,可能是看了那个博文,思想被固定住了。
    crystom
        7
    crystom  
       2016-07-05 17:08:51 +08:00
    我感觉应该在一条线段上随机区 N-1 个点,以切为 N 段,每段长度对应份额。
    这样比较符合微信实际情况,赢者通吃的概率很大
    guizer
        8
    guizer  
       2016-07-05 18:14:37 +08:00
    我感觉应该是 (红包剩余金额-红包剩余个数*0.01 ) 在这个里面随机的
    guizer
        9
    guizer  
       2016-07-05 18:18:02 +08:00
    @guizer 然后个数为 1 就取全部
    guoer
        10
    guoer  
       2016-07-06 00:09:05 +08:00
    记录不是叫你发帖呀
    burn
        11
    burn  
       2016-07-06 01:05:35 +08:00
    如果不设置 $newTotal = ($total/$n)*2 - $min;

    那么有可能红包分到倒数第二个就分光了 ,最后一个只能拿到 0 元
    z21victor
        12
    z21victor  
    OP
       2016-07-06 08:54:42 +08:00   ❤️ 1
    @guoer 好,不能删帖,我换地方记录。见谅了
    z21victor
        13
    z21victor  
    OP
       2016-07-06 08:56:23 +08:00
    @burn 我也是这么想的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3387 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 11:37 · PVG 19:37 · LAX 03:37 · JFK 06:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.