请教一个问题,生成 10 个随机数 [0,100] 且最终 10 个随机数之和为 100 , 用 Python 如何实现

2019-01-20 21:51:47 +08:00
 commoccoom
26029 次点击
所在节点    Python
167 条回复
abysmalIQ
2019-01-21 01:29:11 +08:00
你要先定义你这里的“随机”是什么意思
umbrellakkk
2019-01-21 04:18:10 +08:00
0-100 随机生成 10 个数,然后加起来,如果等于 100,直接输出,不等于就返回继续生成 10 个随机数,直到等于 100 为止,反正现在计算机快,不在乎没效率。
imzhong
2019-01-21 04:30:38 +08:00
你这是线性方程组求解
yuikns
2019-01-21 04:33:17 +08:00
先随机十个数字,再求和,得到的结果除以 100 得到 f,对每个数字除以这个值即可。

若需要,还可以高斯分布再 curve 一下
imzhong
2019-01-21 05:19:27 +08:00
@yuikns 也可以随机出来 10 个,最后再加一个数使 11 个数总和为 100,然后随机出来的每一个数加上 1/10 最后一个数
imzhong
2019-01-21 05:38:40 +08:00
@imzhong 好吧,有负数...
jssyxzy
2019-01-21 06:10:15 +08:00
很简单的问题,你生成 9 个随机数不就是了,最后一个 100- 下。
别杠说你这不是 10 个随机数,你题目本来就做不到 10 个数全部完全随机。
jssyxzy
2019-01-21 06:10:47 +08:00
@celeron533 感谢仁兄的思路。
Mutoo
2019-01-21 06:20:14 +08:00
ayyll
2019-01-21 07:19:08 +08:00
@umbrellakkk 计算机是快。。。但这不是写垃圾代码的理由
Cbdy
2019-01-21 07:21:38 +08:00
概率论了解一下,47 楼正解
bugcoder
2019-01-21 07:35:07 +08:00
整数:
穷举所有相加等于 100 的 10 个[0, 100)整数的组合,然后每次随机抽取一组。
非整数:
每次随机完从剩下的份额里面随机就行了。
opengps
2019-01-21 08:10:27 +08:00
这个做法,完全就是微信或支付宝的**随机红包**逻辑。参考 3 楼的方案使用几何角度解决很完美!!
不过实现起来未必容易,要求普通程序员写数学模型算法不见得容易。那么可以先围绕单个平均值随机时候检查大小,每 2 个红包随机结果求和等于 2 个红包总平均值。
xujinkai
2019-01-21 08:23:05 +08:00
楼主啊 看你拿来干嘛了 是要做红包还是只要求随机 红包的话还会多几个约束条件 比如取到小数点后两位 而且虽然随机但差距又不要太大
airfling
2019-01-21 08:26:39 +08:00
你这是个伪命题,即使前面九个数据都满足,最后一个数据就不可能是随机数,你这个最终结果是越来越不随机
lrh3321
2019-01-21 08:29:19 +08:00
先生成 10 个随机数 wi,作为权重。然后每个数是 100 * wi / sum(wi)
Forbidden
2019-01-21 08:40:00 +08:00
@imzhong 这个思路也是可以的,10 个数之和大于 100 的,第 11 个数取负数即可,但要保证前 10 个数中最小一个要大于第 11 个数绝对值的 1/10
或者最小的不参与减值,其他的减 1/9,然后又回到刚才的要避免的情况里面了……
又或者是第 11 个数随机分 10 份,哈哈又变成原题了……
NotFamous
2019-01-21 08:40:08 +08:00
感觉顶多只能随机前 9 个,第 10 个妥妥的 100 减去前边的和。。。(其实每次抽,下一个数都是 100 减去前边数的总和吧)
MrUser
2019-01-21 08:50:11 +08:00
坐等比 3# 更牛 B 的方法
auciou2
2019-01-21 09:18:16 +08:00
先获得所有的情形:0 ~ 100,共有 101 个数。
假设要求这 10 个数不重复,这 10 个随机数共有:1+2+3+4+5+6+7+8+9+10+11=66 种。(其实不需要统计有多少种)

编写一个循环程序,从 0-100,列举出所有的 10 个不重复的数的组合、与和,循环次数为 101*101。
从这些组合中,让程序自动筛选出所有的和为 100 的(10 个数的)组合。

之后,从这 10 个组合,随机拿出一个组合。
再将这个拿到的组合,再进行随机排列大小。

如果要生成 10 个随机数的和为 200、300,或者 N 个随机数的和为 M,同理。

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

https://ex.noerr.eu.org/t/528903

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

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

© 2021 V2EX