我想从[a,b]范围中生成一个随机数,该随机数可以除以N(在我的情况下为4)。 我有解决方案,但是有没有更好(更优雅)的方法呢?
frontend.loaner.com
解决方案从这里: Python: Generate random number between x and y which is a multiple of 5 无法回答我的问题,因为我必须实现以下内容:
result = random.randint(a, b)
result = math.ceil(result / 4) * 4
我必须将原始范围除以4,并且比我的原始解决方案难读
答案 0 :(得分:1)
我想到的第一件事是使用range在给定间隔中创建所有可能选择的列表,然后使用choice随机选择一个值。
因此,在这种情况下,对于给定的a
和b
,
random.choice(range(a + 4 - (a%4), b, 4))
如果a
是4的完美倍数,则
random.choice(range(a, b, 4))
将为您提供所需的随机数。
因此,在单个通用函数中(如注释中所建议)
def get_num(a, b, x):
if not a % x:
return random.choice(range(a, b, x))
else:
return random.choice(range(a + x - (a%x), b, x))
其中x
是需要倍数的数字。
答案 1 :(得分:1)
使用random.randrange,步长为n
,如果a不被n整除,则以a+n-(a%n)
作为起点,否则,以a
作为起点
import random
def rand_n(a, b,n):
#If n is bigger than range, return -1
if n > b-a:
return -1
#If a is divisible by n, use a as a start, using n as step size
if a%n == 0:
return random.randrange(a,b,n)
# If a is not divisible by n, use a+n-(a%n) as a start, using n as step size
else:
return random.randrange(a+n-(a%n),b, n)
答案 2 :(得分:1)
正如其他人指出的那样,您的解决方案可能会产生超出范围的结果,例如math.ceil(15 / 4) * 4 == 16
。另外,请注意,产生的分布可能与均匀分布相差很远。例如,如果a == 0
和b == 4
,则在80%的情况下,生成的数字将为4。
除此之外,这对我来说似乎很好,但是在Python中,您也可以只使用整数除法运算符(实际上是地板除法运算符,因此它不等同于示例):
result = random.randint(a, b)
result = result // 4 * 4
但是,生成具有特定约束的统一随机数(同时保持均匀分布)的效率较低的通用方法是循环生成它们,直到找到一个好的随机数:
result = 1
while result % 4 != 0:
result = random.randint(a, b)
答案 3 :(得分:1)
通用解决方案和示例
import random
def divisible_random(a,b,n):
if b-a < n:
raise Exception('{} is too big'.format(n))
result = random.randint(a, b)
while result % n != 0:
result = random.randint(a, b)
return result
# get a random int in the range 2 - 12, the number is divisible by 3
print(divisible_random(2,12,3))