繁体   English   中英

如何在Python中使用if语句生成随机数?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM