如何把 100 块钱随机地分成 30 份呢?

2017-04-26 10:47:32 +08:00
 crist
如何把 100 块钱随机地分成 30 份,也就是每一份的钱是不固定的,但是总数加起来必须等于 100 。
9655 次点击
所在节点    问与答
68 条回复
johnny23
2017-04-26 11:45:56 +08:00
重新来 先从 100 元扣出 30 分分别放在 30 个红包里面一个红包一分钱 然后做 9970 次 random(30 的运算) 随机结果是多少就给对应的红包加一分钱 比如 25 就给第 25 个红包加一分钱 直到 9970 次结束
SingeeKing
2017-04-26 12:35:27 +08:00
找来 29 个人建个群,发 100 元分 30 个包,大家领完记录就好了
RqPS6rhmP3Nyn3Tm
2017-04-26 12:43:37 +08:00
离散数学基础啊哥
crist
2017-04-26 13:58:55 +08:00
@johnny23 根据你的描述,应该随机 100 次就已经结束了,为什么还要随机 9970 次呢?除非你是想把 100 块分成 9970 份啊,这样也是 OK 的,不过太耗费资源了,分成 500 个小份再随机加到 30 个红包里面就可以了。点子不错,谢谢你~~
libook
2017-04-26 14:05:46 +08:00
循环随机二分?
循环 29 次,每次把剩下的钱随机分成两份,一份分出去,另一份进入下一次循环。

不知道在概率学上和 1 楼的区别,有大牛来讲一下吗?
blankme
2017-04-26 14:09:36 +08:00
@libook 1 楼是最标准的做法,每份的期望值都是 100/30.
你的做法得到的每份红包期望值都不一样,比如第一份是 50.
acros
2017-04-26 14:10:29 +08:00
困扰的主要是红包带来的潜在限制条件吧··· 分的平均了没意思,大小太极端不行。

所以这个做好后还需要测试下,最好建个群分真钱测试,这样可以如实调研用户心理。
--- 楼主建好这个群后请务必加我。我有时间帮你测试!
jiangzhuo
2017-04-26 14:23:58 +08:00
楼上说发红包的方法,如果有人不领红包怎么能保证我最后得到 30 个数字。
crist
2017-04-26 14:42:34 +08:00
$total = 100;

$pr = 1000; // 分成小份数

$bit = $total / $pr;

$array = [];

for ($i=0; $i < $pr; $i++) {

$array[rand(0,29)] += $bit;
}

echo "<pre>";print_r($array);
echo "total = " . array_sum($array);
vicalloy
2017-04-26 14:44:28 +08:00
最主要的问题是每次分完后,剩下的前足够余下的人分。
简单的写了一下,可能会有 bug

https://gist.github.com/vicalloy/7225cf8749e427882e0e70138353739a
johnny23
2017-04-26 14:58:26 +08:00
@crist 分细的原因只是钱最小单位是分....至于这个单位如何取舍 可以自己控制
johnny23
2017-04-26 15:00:55 +08:00
@crist 因为以前抢红包抢过 1 分钱...所以
lygmqkl
2017-04-26 15:10:13 +08:00
我贡献一个思路,首先要看细分的程度,如果每个人都要有,而且粒度到 1 元,那么就
第一轮先每人给 1 块,剩下 70 元,再进入第二轮
第二轮拿出 30 元,每人 mt_rand(0,1), 如果 0 则不分配,如果 1 则分配 1 元,余下未分配的放回奖池
第三,第四,第五轮, repeat 第二轮

理论上 第三轮结束,应该已经分配出去 90 元, 所以还是很快的。

如果是要到 0.01 ,那么就以 10000 为基数,第一轮每人 1 , 剩下每轮 0-3000 也可以 0-1000 ,多跑几个循环即可。

理论上结果应该和一楼隔板法很接近,其实我是赞同一楼的,但是这种以轮为单位的方法感觉也 ok ,并没有多跑几次,而且看起来更均匀和公平。
ifishman
2017-04-26 15:13:46 +08:00
@blankme 确定一楼的总数是 100 ?
viator42
2017-04-26 15:14:00 +08:00
取一个 0 到 100 的随机数,这个数作为第一份,然后 100 减去这个数,剩下的钱再随机,29 次之后剩下的钱作为第三十份
ifishman
2017-04-26 15:18:50 +08:00
@blankme 既然楼主需要的是红包算法,那就不能采用相同期望值的算法,红包就应该是第一个人抢的时候最容易抢最多的,第二个次之……
Domains
2017-04-26 15:20:25 +08:00
这不就是红包?
理论要看实践
到我这都 36 楼了,要不 LZ 开个群, 100 发个 30 人红包,每次统计好,发一百次
Domains
2017-04-26 15:23:35 +08:00
@ifishman 你要是真抢过红包,你就知道错得过分,抢红包出现在中后段出现的金额普遍较高。另,这真有实践题,有人就专门测试过的,金额高于平均值的普遍出现于中段后
Monad
2017-04-26 15:23:47 +08:00
直接插板法就好了 高中数学
srlp
2017-04-26 15:27:40 +08:00
太复习了。均匀的话,一楼的足够。


@ifishman 一楼的意思是,标记了 29 个挡板之后,每个红包的钱数是两个挡板之间的距离。加起来显然是 100 。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/357405

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX