大家好,我有一个问题,包含任何数字(例如 167)将被分成 12 个随机数,12 个随机数的总和应该是原始数字并且数字是正数,大于零,整数
为此我写了一个代码:
a = 167
n = 12
out = diff([0,sort(randperm(a-1,n-1)),a])
Run Code Online (Sandbox Code Playgroud)
我收到一个错误
名称“diff”未定义
其他方式:
a = 50390
b = rand(10,1)
b = b/sum(b)*a
out=round(b)
out(1) = out(1) - (a-sum(out))
Run Code Online (Sandbox Code Playgroud)
注意:这两个代码都不起作用,所以请告诉我该怎么做
请帮我得到它..谢谢
这应该可以做到。
from random import randint
a = 167
n = 12
assert a >= n >= 1
pieces = []
for idx in range(n-1):
# Number between 1 and a
# minus the current total so we don't overshoot
# minus 1 for each number that hasn't been picked
# so they can all be nonzero
pieces.append(randint(1,a-sum(pieces)-n+idx))
pieces.append(a-sum(pieces))
Run Code Online (Sandbox Code Playgroud)
请注意,这些数字不是独立的;任何时候添加像 之类的约束THE n VALUES MUST TOTAL a,都会消除一些随机性。在这里,分布中后面的数字可能小于前面的数字,直到最后一个数字预计再次平均。如果您不喜欢这种趋势,您可以查看shuffle()结果列表pieces。
编辑:对于浮点数,您不必为下一个值节省空间(对于非负整数而不是正整数也是如此),所以它看起来有点不同。基本上,您只需-n+idx从表达式中删除该术语,因为您不再需要分配n-idx更多 >=1 的块。
from random import uniform
a = 166.667
n = 12
assert a > 0
assert n >= 1
pieces = []
for idx in range(n-1):
# Number between 0 and a
# minus the current total so we don't overshoot
pieces.append(uniform(0,a-sum(pieces)))
pieces.append(a-sum(pieces))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3653 次 |
| 最近记录: |