python任意正整数的数字累加和_在一个范围内生成N个正整数,在python中累加总数...

我看到其他帖子解决了类似的问题.我知道如何生成N个正整数.我也知道如何限制随机生成的整数之和.唯一的问题是满足N值中没有一个超出指定范围的条件.

例如generate_ints(n,total,low,high)应该生成n值数组,使得每个值都在低和高之间,并且总和加起来总和.任何指针/帮助将不胜感激.

eggenerate_ints(4,40,4,15)应该生成类似的东西

[7,10,13,10]

我不在乎这些数字是否重复,只要它们没有高度倾斜.我使用np.randon.randint(5,15,n)来选择整数.

到目前为止,我已尝试过以下内容,但它不起作用 –

import numpy as np

import random

from random import uniform as rand

total=50

n=10

low=2

high=15

result=[]

m=0

nobs=1

while nobs <= n:

if m >= (total - low):

last_num= total -new_tot

result.append(last_num)

else:

next_num=np.random.randint(low,high,1)

new_tot = sum(result) + next_num

result.append(next_num)

m=new_tot

nobs +=1

print result

print sum(result)

再次感谢.

解决方法:

import numpy as np

def sampler(samples, sum_to , range_list):

assert range_list[0]

arr = np.random.rand(samples)

sum_arr = sum(arr)

new_arr = np.array([int((item/sum_arr)*sum_to) if (int((item/sum_arr)*sum_to)>range_list[0]and int((item/sum_arr)*sum_to)

else np.random.choice(range(range_list[0],range_list[1]+1)) for item in arr])

difference = sum(new_arr) - sum_to

while difference != 0:

if difference < 0 :

for idx in np.random.choice(range(len(new_arr)),abs(difference)):

if new_arr[idx] != range_list[1] :

new_arr[idx] += 1

if difference > 0:

for idx in np.random.choice(range(len(new_arr)), abs(difference)):

if new_arr[idx] != 0 and new_arr[idx] != range_list[0] :

new_arr[idx] -= 1

difference = sum(new_arr) - sum_to

return new_arr

new_arr = sampler (2872,30000,[5,15])

print "Generated random array is :"

print new_arr

print "Length of array:", len(new_arr)

print "Max of array: ", max(new_arr)

print "min of array: ", min(new_arr)

print "and it sums up to %d" %sum(new_arr)

结果:

Generated random array is :

[ 9 10 9 ..., 6 15 11]

Length of array: 2872

Max of array: 15

min of array: 5

and it sums up to 30000

标签:python,random,python-2-7,range,numpy

来源: https://codeday.me/bug/20190711/1429460.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值