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

2017-04-26 10:47:32 +08:00
 crist
如何把 100 块钱随机地分成 30 份,也就是每一份的钱是不固定的,但是总数加起来必须等于 100 。
9941 次点击
所在节点    问与答
68 条回复
zander
2017-04-26 23:47:16 +08:00
@ifishman 29 个点, 30 个线段。
imn1
2017-04-27 00:14:55 +08:00
@libook
@Actrace
这样分,其实不太合理,因为
理论上只有第一位有可能获得最高值 99.71 (其他都是 0.01 ),剩下的 29 位均无法获得这个最高值,概率为 0
而且获得更大值的概率逐次降低
所以,这样做,必须分配完成后打乱顺序,否则顺位靠前必然占优,即使是随机,概率也是占优的

使用平均数也是不合理的,因为算出平均数,再做一次腾挪的话,基本上每份的最大值只能是 平均数*2 ,除非做多次腾挪;但这种方法,如果本意是避免落差太大的分配,是可以的
libook
2017-04-27 00:19:25 +08:00
@imn1 所以二分法之后再打乱顺序的话是不是就公平了?
Actrace
2017-04-27 00:40:34 +08:00
@imn1 你提到的问题好解决,如果你想要让某个人获得最高值的概率是随机的,可以把红包提前分配好,然后再将分配好的红包配额随机分发给其他人。

理论上来说,算法本身是合理的,因为随机数函数本身就是随机的。按照微信红包的那种设定,即使第一个人领取了更多的配额,这也是随机的,不存在公平性问题讨论,因为这里的目标是“随机”,实际上第一个领红包的人也是随机的。

设定 min 和 max 也只是为了让落差有一个可控的程度,也就是说楼主想要“公平”的话,这个是附加福利(可选项)。
imn1
2017-04-27 00:46:15 +08:00
@libook
依题目,只要符合一次整体随机就可以了,就是数额和顺序,所以递减逐次随机取数额及随机顺序应该满足
不过我个人不太喜欢,又说不出什么道理

个人倾向#15 的权重方法,这种方法是不理会总额的完全随机,再换算成总额 100 的占比

#1 插板法理论上也是完全随机,但这种方法有个弊端,就是不能在相同位置插两块,所以程序是要限制的
而#15 则没有这个问题
imn1
2017-04-27 00:52:19 +08:00
@Actrace
如上面所说,我也说不出道理
不过抢红包有点不同,它本身就含有“抢”顺位的意味,所以顺位靠前获得更多的数额,这个概率大点是合理的
zhangsen1992
2017-04-27 09:46:28 +08:00
l = [random.randint(0,100) for i in range(30)]
map(lambda x:100*x/float(sum(l)),l)
imn1
2017-04-28 18:02:45 +08:00
再补充一下:
这个不同抽样方法之间的区别就是,每次抽取的样本是否返回样本库,是,则为排列,否,则为组合

#1 每次取值均不能与前面相同,就是样本不返回样本库
#15 可以多次相同值,所以是样本返回样本库,而且理论上样本库无限大,只要计算机能处理则可
而每次扣除取出金额,递减再随机,也是不返回样本库,而且样本库的减少比#1 插板法更甚
至于平均再腾挪,属于分段抽样法,样本库远小于前面三种

其实哪种方法都能实现目标(没有离题),看需求选择啰

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

https://tanronggui.xyz/t/357405

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

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

© 2021 V2EX