В такой ситуации полезен генератор . Напишите функцию с бесконечным l oop, которая возвращает случайные числа, соответствующие вашим критериям, а затем используйте оператор yield
, чтобы возвращать эти значения по одному при вызове функции.
Вот пример. Я добавил немного кода, чтобы проверить входные параметры и убедиться, что в данном диапазоне есть действительные результаты.
def random_not_power_of_2(rmin, rmax):
# Returns a random number r such that rmin <= r < rmax,
# and r is not a power of 2
from random import randint
# Sanity check
if rmin < 0:
raise ValueError("rmin must be non-negative")
if rmax <= rmin:
raise ValueError("rmax must be greater than rmin")
# Abort if the given range contains no valid numbers
r = rmin
isValid = False
while r < rmax:
if r == 0 or (r & (r-1) > 0):
isValid = True
break
r += 1
if not isValid:
raise ValueError("no valid numbers in this range")
while True:
r = randint(rmin, rmax)
if r == 0 or (r & (r-1) > 0):
yield r
def get_random_list(rmin, rmax, n):
# Returns a list of n random numbers in the given range
gen = random_not_power_of_2(rmin, rmax)
return [next(gen) for i in range(n)]
get_random_list(0,17,10)