Как сгенерировать случайное число, чтобы оно не было степенью 2? На выходе должен быть список из 8 случайных чисел - PullRequest
0 голосов
/ 22 января 2020

В python как сгенерировать случайное число, чтобы оно не было степенью 2? На выходе должен быть список из 8 случайных чисел. Это должно быть сделано в одном выражении (стиль понимания) в python.

Ответы [ 2 ]

0 голосов
/ 22 января 2020

В такой ситуации полезен генератор . Напишите функцию с бесконечным 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)
0 голосов
/ 22 января 2020

Попробуйте код ниже,

def is_power_of_two (x): 
    return (x and (not(x & (x - 1))) )

def get_random(start, stop):
    while True:
        value = random.randint(start, stop)
        if not is_power_of_two(value):
            return value

    return [i for i in range(limit) if not is_power_of_two(i)]

result = [get_random(0, 10000000000) for _ in range(8)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...