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

时间:2018-01-05 17:40:20

标签: python numpy random

我想使用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)

任何想法或更多起点?

7 个答案:

答案 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])

这是一个将所有内容组合在一起的屏幕截图:

enter image description here

说明:

k = mapping[np.max(np.where(n > mapping[:,0])),1]只是查找数组mapping所需的随机值数。 n > mapping[:,0]返回一个布尔数组,对于小于Truen的所有数字,其值将为Falsenp.where(...)将返回数组元素的索引为true。由于mapping的第一列(即mapping[:,0])中的值是递增的,因此我们可以找到小于n的{​​{1}}调用np.max(...)的最大索引。最后,我们需要第二列中的相应值,这就是为什么我们将其结果作为索引传递给再次映射,即mapping[...,1],其中1用于第二列。