我想使用python生成具有特定限制的随机数。代码应该执行以下操作:
如果输入的号码是:
0,然后生成0个随机非经常数字
< 1,然后生成1个随机的非经常数字
< 9,然后产生2个随机的非经常数字
< 15,然后产生3个随机的非经常数字
< 26,然后产生5个随机的非经常数字
< 51,然后产生8个随机的非经常数字
< 91,然后产生13个随机的非经常数字
< 151,然后产生20个随机的非经常数字
< 281,然后产生32个随机的非经常数字
随机数的值应受输入数字的值限制。因此,如果输入75,则代码应生成13个随机数,其中75个是13个数字中的最高值。 75并不一定是实际的最高数字,只是在最大值方面。
我的猜测是使用numpy。以下是我到目前为止(在用户帮助下)。
num_files=[0,1,9,...]
num_nums=[0,1,2,3,5,...]
for zipp in zip(num_files,num_nums)
if len(docx_files)<zipp[0]:
list_of_rands=np.random.choice(len(docx_files)+1,
zipp[1],replace=False)
任何想法或更多起点?
答案 0 :(得分:1)
这是实现目标的一种方式。只需压缩数字列表和截止值,然后检查数字输入(下面代码中的变量number
)是否高于截止值。请注意,这并不能处理大于281的数字的情况,因为我不确定根据您的描述应该发生什么。
import numpy as np
number = 134
parameters = zip([9, 15, 26, 51, 91, 151], [3, 5, 8, 13, 20, 32])
nums = 2
for item in parameters:
if number > item[0]:
nums = item[1]
np.random.choice(number, nums)
答案 1 :(得分:1)
您可以使用if-elif-else
来避免多分支的np.searchsorted
:
import numpy as np
def generate(x):
boundaries = np.array([1, 2, 9, 15, 26, 51, 91, 151, 281])
numbers = np.array([0, 1, 2, 3, 5, 8, 13, 20, 32])
return [np.random.choice(j, n, False)+1 if j else np.array([], np.int64)
for j, n in np.broadcast(x, numbers[boundaries.searchsorted(x, 'right')])]
# demo
from pprint import pprint
# single value
pprint(generate(17))
# multiple values in one go
pprint(generate([19, 75, 3, 1, 2, 0, 8, 9]))
# interactive
i = int(input('Enter number: '))
pprint(generate(i))
示例输出:
[array([ 9, 1, 14, 4, 12])]
[array([ 8, 12, 6, 17, 4]),
array([17, 29, 2, 20, 16, 37, 36, 13, 34, 58, 49, 72, 41]),
array([1, 3]),
array([1]),
array([2, 1]),
array([], dtype=int64),
array([1, 8]),
array([3, 2, 6])]
Enter number: 280
[array([184, 73, 80, 280, 254, 164, 192, 145, 176, 29, 58, 251, 37,
107, 5, 51, 7, 128, 142, 125, 135, 87, 259, 83, 260, 10,
108, 210, 8, 36, 181, 64])]
答案 2 :(得分:0)
我不知道如何在您的代码中实现它,但是使用此代码,您就可以得到randoms:
import random
x = 51
if x < 26:
ar_Random = [None]*5
for i in range(0, 6):
ar_Random[i] = random.randint(startNumOfRandom, stopNumOfRandom)
elif x < 51:
ar_Random = [None]*8
for i in range (0,9):
ar_Random[i] = random.randint(startNumOfRandom, stopNumOfRandom)
...
答案 3 :(得分:0)
我不确定你是如何将长度映射到输入的,但这就是你使用Numpy生成N个随机数的方法。
import numpy as np
//set entered_num and desired_length to whatever you want
random_nums = np.random.randint(entered_num, size = desired_length)
答案 4 :(得分:0)
import random
Starting_Number = int(input())
if Starting_Number < 26:
print(random.sample(range(1, 26), 5))
elif Starting_Number < 51:
print(random.sample(range(1, 51), 8))
elif Starting_Number < 91:
print(random.sample(range(1, 91), 13))
你走了!!!
random.sample是您正在寻找的模块。
有一个好的!
答案 5 :(得分:0)
您可以使用字典作为键和随机数的值作为值来定义函数:
import random
def rand_nums(input_num):
d = {26: 5, 51: 8, 91: 13}
for k, v in d.items():
if input_num in range(k):
nums = random.sample(range(k+1), v)
return nums
print(rand_nums(20))
print(rand_nums(50))
print(rand_nums(88))
[14, 23, 11, 9, 5]
[9, 49, 23, 16, 8, 50, 47, 33]
[20, 16, 28, 77, 21, 87, 85, 82, 10, 47, 43, 90, 57]
>>>
答案 6 :(得分:0)
怎么样:
def gen_rand_array(n):
mapping = np.array([[1,1],
[26,5],
[51,8],
[91,13]])
k = mapping[np.max(np.where(n > mapping[:,0])),1]
return np.random.choice(n+1,k)
示例:
>>> gen_rand_array(27)
array([ 0, 21, 26, 25, 23])
>>> gen_rand_array(27)
array([21, 5, 10, 3, 13])
>>> gen_rand_array(57)
array([30, 26, 50, 31, 44, 51, 39, 13])
>>> gen_rand_array(57)
array([21, 18, 35, 8, 13, 13, 20, 3])
这是一个将所有内容组合在一起的屏幕截图:
说明:
行k = mapping[np.max(np.where(n > mapping[:,0])),1]
只是查找数组mapping
所需的随机值数。 n > mapping[:,0]
返回一个布尔数组,对于小于True
,n
的所有数字,其值将为False
。 np.where(...)
将返回数组元素的索引为true。由于mapping
的第一列(即mapping[:,0]
)中的值是递增的,因此我们可以找到小于n
的{{1}}调用np.max(...)
的最大索引。最后,我们需要第二列中的相应值,这就是为什么我们将其结果作为索引传递给再次映射,即mapping[...,1]
,其中1
用于第二列。