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

2019-01-20 21:51:47 +08:00
 commoccoom
26029 次点击
所在节点    Python
167 条回复
commoccoom
2019-01-21 10:36:50 +08:00
@xinClever 我能想到的也是这样。
commoccoom
2019-01-21 10:37:22 +08:00
@celeron533 感谢帮助!
shintendo
2019-01-21 10:37:43 +08:00
我这个思路不知道对不对:
想象你有 100 个小球排成一行,标号 1-100,现在要随机插入 9 块隔板,把它分成 10 段,每段的个数就是你要的结果。
再把隔板视为特殊的小球,问题转化为从 109 个小球中随机选 9 个。
SeaRecluse
2019-01-21 10:38:35 +08:00
@huahuajun9527 这样的写法其实对于第一位和最后一位是不公平的
shintendo
2019-01-21 10:39:20 +08:00
看错了,是 0-100。
那就是从 0-109 中随机取 9 个整数即可。
SeaRecluse
2019-01-21 10:41:18 +08:00
@shintendo 你的想法是对的,但是是插入 10 个隔板,因为围成圈后没有开头结尾。
SeaRecluse
2019-01-21 10:41:57 +08:00
@SeaRecluse get_sum = -10 初始化的时候,写错了
biossun
2019-01-21 10:42:52 +08:00
把 100 进行 10 等分,两两之间随机偏移一下。
seven777
2019-01-21 10:45:34 +08:00
@Linxing
这个方法更简明易懂。
xpresslink
2019-01-21 10:47:28 +08:00
@jssyxzy 你说的办法理论上是可行的,但是实践中是不可用的。
生成的 9 个随机数之和大于 100 的概率太大了,要远远大于正好小于 100 的概率,所以就要反复生成直要碰上符合条件的,极端情况下上秒出不了结果的可能都有,算法时间复杂度不可控制。

还是 3 楼方法科学一些。
shintendo
2019-01-21 10:54:40 +08:00
@SeaRecluse
还是老哥考虑仔细
xpresslink
2019-01-21 11:05:28 +08:00
@seven777 那个方法是很垃圾的方法
我试验了一下,连续生成的 9 个 1-100 的随机数之和小于 100 的概率是上百万分之一。
wqzjk393
2019-01-21 11:14:28 +08:00
随机取 10 个点,按从小到大排序。取最大的一个放大到 100,其余的根据这个放大比例放大。最后的返回的 10 个随机数就是这 10 个点的间隔,就是 x[10]-x[9],x[9]-x[8]....x[0]
shuson
2019-01-21 11:27:06 +08:00
total = 10
count = 10

nTotal = total * 10

from random import randint

for i in range(10):
if nTotal < 1: break
n = randint(1, nTotal)
while n + (10 - i) > nTotal:
n = randint(1, nTotal)

nTotal -= n
print("person " + str(i) + " got " + str(n/10) + " dollar")
imaple
2019-01-21 11:28:48 +08:00
拿个秒表然后 100 秒内点 9 下暂停 https://ex.noerr.eu.org/static/img/doge.gif
jssyxzy
2019-01-21 11:29:21 +08:00
@nicking
@xpresslink
@NotFamous 已经给出细节了,见他括号内
wjfz
2019-01-21 11:31:14 +08:00
你这不是“像”,感觉就“是”啊。
wjfz
2019-01-21 11:33:39 +08:00
哎哟没发完提交了。

前两天帮朋友解决了这么一个需求,最后也是靠红包算法解决的。

要求给一个数字,如 15.14
再给一个浮动范围,± 0.03

求 5 个数字在浮动范围内,并且平均值==15.14
LifStge
2019-01-21 11:35:59 +08:00
大小为 10 的数组 选个分布合适的随机函数 循环 100 次 范围 0_99 然后指定下标+1 吧 哈哈哈哈
kart891209
2019-01-21 11:38:53 +08:00
随机 9 个数,每次 random 的 bound 是(剩余可取的数值+剩余坑数)最后一个减法即可

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

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

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

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

© 2021 V2EX