Я пытаюсь сгенерировать случайное число в Python, но мне нужно, чтобы оно включало определенные цифры. Допустим, диапазон, который я хочу для него, находится между 100000 и 999999, поэтому я хочу, чтобы он был в этом диапазоне, но также включал числа, такие как 1, 4 и 5. Есть ли способ сделать это?

2
cooljake20 11 Янв 2022 в 04:41
Сгенерировать случайное число. Если в нем нет цифры 4, случайным образом замените одну из цифр на 4. Повторите эти действия для всех нужных цифр. Или просто продолжайте генерировать случайные числа, пока не получите тот, который соответствует всем критериям.
 – 
John Gordon
11 Янв 2022 в 04:44
Я бы сказал, что это действительно невозможно. Или, вероятно, это возможно, но тогда ваше число не будет случайным, поэтому оно как бы победит случайность. Вы сильно ограничите количество возможных чисел. Лучшим решением будет либо заранее определенный список ваших допустимых номеров и случайный выбор одного из них, либо создание случайного числа, проверка, соответствует ли оно вашим требованиям, если нет, попробуйте еще раз и зациклите до приемлемого.
 – 
Adam Birds
11 Янв 2022 в 04:47
Привет и добро пожаловать в StackOverflow! Просто чтобы уточнить, хотите ли вы, чтобы 1, 4 или 5 были включены в качестве цифры в случайно сгенерированное число (например, 130929, 230984 , или 500000), или вы просите, чтобы номера 1, 4 и 5 были включены в возможный пул номеров, которые могут быть сгенерированы при запросе случайный номер?
 – 
Nathan Ansel
11 Янв 2022 в 04:59
1
Привет спасибо. Я спрашиваю, как сделать так, чтобы 1, 4 и 5 включались как цифры в случайно сгенерированное число.
 – 
cooljake20
11 Янв 2022 в 05:44

5 ответов

Лучший ответ

Вы можете построить число цифра за цифрой

>>> import random
>>> def fun(required=(),size=6):
        result = list(required)
        n = size-len(result)
        result.extend( random.randint(0,10) for _ in range(n)) # fill in the remaining digits
        random.shuffle(result) 
        assert any(result) #make sure that there is at least one non zero digit
        while not result[0]: #make sure that the first digit is non zero so the resulting number be of the required size
            random.shuffle(result)
        return int("".join(map(str,result)))

>>> fun([1,4,5])
471505
>>> fun([1,4,5])
457310
>>> fun([1,4,5])
912457
>>> fun([1,4,5])
542961
>>> fun([1,4,5])
145079
>>> 
3
Copperfield 11 Янв 2022 в 05:10
Лучший ответ +1.
 – 
kpie
11 Янв 2022 в 05:15

Создайте набор требуемых чисел в виде строк и создайте список допустимых чисел, в котором требуемые целые числа отображаются с использованием set.intersection в строковом представлении чисел. Затем используйте random.choice, чтобы выбрать случайное число из допустимого списка:

import random
required = set(map(str, [1,4,5]))
valid_numbers = [int(num) for num in map(str, range(100000,1000000)) if required.intersection(num)]
random.choice(valid_numbers)
0
enke 11 Янв 2022 в 04:56

Самый простой способ сделать это — добавить несколько дополнительных чисел в начало или конец вашего диапазона, а затем сопоставить эти дополнительные числа с теми, которые вам нужны. Используя ваш пример 1, 4 и 5, этот пример показывает, как это будет работать.

import random

num = random.randint(99997, 999999)
if num == 99997:
  num = 1
elif num == 99998:
  num = 4
elif num == 99999:
  num = 5
print(num)
0
Nathan Ansel 11 Янв 2022 в 05:06
Я не уверен, что вы поняли вопрос.
 – 
kpie
11 Янв 2022 в 05:17
Пожалуйста, как вы находите мой короткий подход? #JdevSeer
 – 
JdevSeer
11 Янв 2022 в 05:28

Очевидный ответ для меня - грубая сила.

import random

def check(digits,number):
    passes = True
    number = str(number)
    for k in digits:
        if not str(k) in number:
            passes = False
            break
    return passes

def genRandom(digits):
    minimum = 100000
    maximum = 1000000
    r = minimum+int(random.random()*(maximum-minimum))
    while not check(digits,r):
        r = minimum + int(random.random() * (maximum - minimum))
    return r

print(genRandom([1,4,5]))

Из чтения комментариев я видел 3 других твердых предложения. Сначала случайным образом замените цифры нужными значениями. Это звучит просто, но требует некоторой уродливости, чтобы избежать замены цифр, которые вы обозначили как необходимые, и избежать ошибок индекса, когда потенциально можно получить цифры после конца вашего номера.

import random

def genRandom(digits):
    digits = [str(k) for k in digits]
    minimum = 100000
    maximum = 1000000
    r = str(minimum+int(random.random()*(maximum-minimum)))
    for k in digits:
        while not k in r:
            i = int(random.random()*len(r))
            if r[i] in digits:
                if i==len(r)-1:
                    if not r[i] in r[0:i]:
                        continue
                elif not r[i] in r[0:i]+r[i+1:]:
                    continue
            if i==len(r)-1:
                r=r[0:i]+k
            else:
                r=r[0:i]+k+r[i+1:]
    return(r)

print(genRandom([1,4,5]))

Третий вариант создания списка допустимых чисел и выбора из него был хорошо изложен enke в их ответе. Хотя это красивый ответ, на самом деле он значительно более интенсивен с точки зрения времени выполнения для одного вызова.

Лучший ответ, на мой взгляд, состоит в том, что Копперфильд построил цифру за цифрой.

0
kpie 11 Янв 2022 в 05:16
import random

random.randint(100000, 999999)

Если я правильно понимаю ваш вопрос, это должно быть то, что вы хотите

-1
RedstoneRadiant 11 Янв 2022 в 04:44
Они хотят убедиться, что число содержит определенные цифры, такие как 4 и 5.
 – 
John Gordon
11 Янв 2022 в 04:45
Это не ответит на вопросы, касающиеся содержания конкретных цифр.
 – 
Adam Birds
11 Янв 2022 в 04:47