生存一个随机数列,但要求总和固定常数
如何用生成一个随机数列,每个数的随机范围在(j, k)之间,需要生成n个,总和固定住,比如m
这个n可能会比较大,我试过递归的方式,但是失败了。
对效率没有要求
回答:
首先,你必须要m/n
在(j,k)
范围内才可能
还有,你没有提出随机性的要求,为了保障高效,可以做一些特殊处理,比如其实真正随机生成了n/2
个 K1
数字,然后找到对应的另外n/2
个K2
,使得 k1+k2 = 2m/n
。
至于生成的随机数在 (j,k)
范围内,python
的random
模块直接就有方法,比如random.uniform(a,b)
就是随机生成 [a,b]
范围内的浮点数,random.randint(a, b)
就是随机生成 [a,b]
范围内的整数。
此外生成了n个数后,再用随机扑克排序方法,最后输出效果更好。
回答:
我们先假定几个数,j=1, k=10, m=10, n=4
我这里是允许有多个重复值出现。
首先我们要保证n
个数能生成出来,我们要求第一个数不能太大,比如第一个出来了 7
,后面的数就出不来了,所以我们要求第一个随机数要小于等于 m-(n-1)*j
。
每生成一个数我们都可以调整 k
的值了,过大的 k
已经没有意义了,让它等于 m-已生成数之和-(n-1-当前个数)*j
。
在剩余的数字个数乘 k
将要不满足剩余和的时候,修正一下 j
的值,剩余和与个数取平均值,j
与k
分别为平均值的两端,继续在这个范围内取随机数。
这样修正 j
的值就是有点过早。
简单的写一个示例,需要更多的要求可以再做修改:
def fun_a(j=0, k=10, m=10, n=4): if m > n * k or m < n * j:
print 'can not generate the num list.'
return
data = []
k = k if k <= m else m
for i in range(n):
# 这里修正 j 的值
if (n - i - 1) * k < m - sum(data):
j = 2 * ((m - sum(data)) / (n - i)) - k
if i == n - 1:
tmp = k
else:
tmp = random.randint(j, k)
# if i == 0:
while tmp > m - (n-1-i) * j - sum(data):
tmp = random.randint(j, k)
data.append(tmp)
tmp_k = m - sum(data) - (n - 2 - i)*j
k = tmp_k if k > tmp_k else k
return data
以上是 生存一个随机数列,但要求总和固定常数 的全部内容, 来源链接: utcz.com/p/938206.html