![](/img/trans.png)
[英]How to break multiple loops in an if-statement within an if-statement in Python 3
[英]How to generate random numbers with if-statement in Python?
我想使用python生成具有特定限制的随机数。 该代码应执行以下操作:
如果输入的数字是:
0,然后生成0个随机非经常性数字
<1,然后生成1个随机非经常性数字
<9,然后生成2个随机非经常性数字
<15,然后生成3个随机非经常性数字
<26,然后生成5个随机非经常性数字
<51,然后生成8个随机非经常性数字
<91,然后生成13个随机非经常性数字
<151,然后生成20个随机非经常性数字
<281,然后生成32个随机非经常性数字
随机数的值应受输入数字的值的限制。 因此,如果输入75,则代码应生成13个随机数,其中13个数字中的最大值为75。 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)
有什么想法或更多起点吗?
这是一种方法。 只需压缩数字和截止值的列表,然后检查输入的数字(下面代码中的变量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)
您可以使用np.searchsorted
避免多分支if-elif-else
:
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])]
我不知道如何在您的代码中实现它,但是通过此代码,您便获得了随机数:
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)
...
我不确定如何将长度映射到输入,但这是使用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)
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是您正在寻找的模块。
祝你有个好的一天!
您可以使用字典定义函数,其范围作为键,随机数作为值:
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]
>>>
怎么样:
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]
返回一个布尔数组,对于所有小于n
的数字,其值为True
,否则为False
。 np.where(...)
将返回为真的数组元素的索引。 由于mapping
的第一列中的值(即mapping[:,0]
)正在递增,因此调用np.max(...)
可以找到小于n
的最大索引。 最后,我们需要第二列中的相应值,这就是为什么我们将其结果作为索引再次传递到映射的原因,即mapping[...,1]
其中1
代表第二列。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.