Estoy tratando de generar un número aleatorio en Python, pero necesito que incluya ciertos dígitos. Digamos que el rango que quiero para él está entre 100000 y 999999, entonces quiero que esté en ese rango pero que también incluya números como 1, 4 y 5. ¿Hay alguna manera de hacer esto?

2
cooljake20 11 ene. 2022 a las 04:41
Genera un número aleatorio. Si no tiene el dígito 4, reemplace aleatoriamente uno de los dígitos con un 4. Repita para todos los dígitos deseados. O simplemente siga generando números aleatorios hasta que obtenga uno que cumpla con todos los criterios.
 – 
John Gordon
11 ene. 2022 a las 04:44
Yo diría que esto no es realmente posible. O probablemente sea posible, pero entonces su número no sería aleatorio, por lo que derrotaría la aleatoriedad. Limitarás severamente la cantidad de números posibles. La mejor solución sería una lista predeterminada de su número aceptable y elegir uno al azar, o generar un número aleatorio, verificar si cumple con sus requisitos, si no, intente nuevamente y repita hasta que sea aceptable.
 – 
Adam Birds
11 ene. 2022 a las 04:47
¡Hola y bienvenido a StackOverflow! Solo para aclarar, ¿quieres que 1, 4 o 5 se incluyan como un dígito en el número generado aleatoriamente (como 130929, 230984 , o 500000), o está solicitando que los números 1, 4 y 5 se incluyan en el posible conjunto de números que podrían generarse al solicitar un ¿número aleatorio?
 – 
Nathan Ansel
11 ene. 2022 a las 04:59
1
Hola Gracias. Estoy preguntando cómo hacer que 1, 4 y 5 se incluyan como un dígito en el número generado aleatoriamente.
 – 
cooljake20
11 ene. 2022 a las 05:44

5 respuestas

La mejor respuesta

Puedes construir el numero digito a digito

>>> 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 ene. 2022 a las 05:10
Mejor respuesta +1.
 – 
kpie
11 ene. 2022 a las 05:15

Cree un conjunto de números requeridos como cadenas y cree una lista de números válidos donde los enteros requeridos aparecen usando set.intersection en la representación de números de cadena. Luego use random.choice para seleccionar un número aleatorio de la lista válida:

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 ene. 2022 a las 04:56

La forma más fácil que se me ocurre de hacer esto es agregar algunos números adicionales al principio o al final de su rango y luego asignar esos números adicionales a los que desea. Usando su ejemplo de 1, 4 y 5, este ejemplo muestra cómo funcionaría.

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 ene. 2022 a las 05:06
No estoy seguro de que hayas entendido la pregunta.
 – 
kpie
11 ene. 2022 a las 05:17
Por favor, ¿cómo encuentras mi enfoque corto? #JdevSeer
 – 
JdevSeer
11 ene. 2022 a las 05:28

La respuesta obvia para mí es la fuerza bruta.

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

Al leer los comentarios, he visto otras 3 sugerencias sólidas. Primero reemplace aleatoriamente los dígitos con los valores necesarios. Lo cual suena simple pero requiere cierta fealdad para evitar reemplazar los dígitos que ha designado como necesarios y para evitar errores de índice cuando potencialmente se superan los dígitos del final de su número.

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

La tercera opción de generar una lista de números aceptables y seleccionarlos fue bien expresada por enke en su respuesta. Si bien esta es una buena respuesta, en realidad es sustancialmente más intensiva en términos de tiempo de ejecución para una sola llamada.

En mi opinión, la mejor respuesta es que Copperfield construye el número dígito por dígito.

0
kpie 11 ene. 2022 a las 05:16
import random

random.randint(100000, 999999)

Si estoy entendiendo tu pregunta correctamente, esto debería ser lo que quieres.

-1
RedstoneRadiant 11 ene. 2022 a las 04:44
Quieren asegurarse de que el número contenga dígitos específicos como 4 y 5.
 – 
John Gordon
11 ene. 2022 a las 04:45
Esto no respondería las preguntas con respecto a contener dígitos específicos.
 – 
Adam Birds
11 ene. 2022 a las 04:47