Generar enteros aleatorios entre 0 y 9

1339

¿Cómo puedo generar enteros aleatorios entre 0 y 9 (inclusive) en Python?

Por ejemplo, 0, 1, 2, 3, 4, 5, 6, 7, 8,9

aneuryzm
fuente
16
Bonitos puntos de estilo en la generación "aleatoria" de 0-9
ColinMac

Respuestas:

467
import random
print(random.randint(0,9))

random.randint(a, b)

Devuelve un entero aleatorio N tal que a <= N <= b.

Documentos: https://docs.python.org/3.1/library/random.html#random.randint

JMSamudio
fuente
1
En las versiones más recientes de Python, el límite superior parece ser exclusivo (es decir randint(0,9), nunca devolverá 9). Esto no se refleja en la documentación en línea, pero está en la ayuda integrada.
Yly
134

Prueba esto:

from random import randrange, uniform

# randrange gives you an integral value
irand = randrange(0, 10)

# uniform gives you a floating-point value
frand = uniform(0, 10)
Andrew Hare
fuente
81
from random import randint

x = [randint(0, 9) for p in range(0, 10)]

Esto genera 10 enteros pseudoaleatorios en el rango de 0 a 9 inclusive.

usuario14372
fuente
64

El secretsmódulo es nuevo en Python 3.6. Esto es mejor que el randommódulo para criptografía o usos de seguridad.

Para imprimir aleatoriamente un número entero en el rango inclusivo 0-9:

from secrets import randbelow
print(randbelow(10))

Para más detalles, ver PEP 506 .

Chris_Rands
fuente
3
Esto mejoraría la respuesta y debería agregarse. Las respuestas más preocupadas por la seguridad siempre deben agregarse si están disponibles.
SudoKid
31

Elija el tamaño de la matriz (en este ejemplo, he elegido que el tamaño sea 20). Y luego, usa lo siguiente:

import numpy as np   
np.random.randint(10, size=(1, 20))

Puede esperar ver una salida de la siguiente forma ( se devolverán enteros aleatorios diferentes cada vez que lo ejecute; por lo tanto, puede esperar que los enteros en la matriz de salida difieran del ejemplo que se muestra a continuación ).

array([[1, 6, 1, 2, 8, 6, 3, 3, 2, 5, 6, 5, 0, 9, 5, 6, 4, 5, 9, 3]])
Plebeyo
fuente
3
También es útil saber cómo Numpy puede generar una matriz aleatoria de tamaño específico, no solo un número aleatorio. (Documentos: numpy.random.randint )
jkdev
28

Prueba esto a través de random.shuffle

>>> import random
>>> nums = range(10)
>>> random.shuffle(nums)
>>> nums
[6, 3, 5, 4, 0, 1, 2, 9, 8, 7]
zangw
fuente
Esta no es una respuesta correcta y debe eliminarse.
Nicolas Gervais
22

Intentaría uno de los siguientes:

1.> numpy.random.randint

import numpy as np
X1 = np.random.randint(low=0, high=10, size=(15,))

print (X1)
>>> array([3, 0, 9, 0, 5, 7, 6, 9, 6, 7, 9, 6, 6, 9, 8])

2.> numpy.random.uniform

import numpy as np
X2 = np.random.uniform(low=0, high=10, size=(15,)).astype(int)

print (X2)
>>> array([8, 3, 6, 9, 1, 0, 3, 6, 3, 3, 1, 2, 4, 0, 4])

3.> random.randrange

from random import randrange
X3 = [randrange(10) for i in range(15)]

print (X3)
>>> [2, 1, 4, 1, 2, 8, 8, 6, 4, 1, 0, 5, 8, 3, 5]

4.> random.randint

from random import randint
X4 = [randint(0, 9) for i in range(0, 15)]

print (X4)
>>> [6, 2, 6, 9, 5, 3, 2, 3, 3, 4, 4, 7, 4, 9, 6]

Velocidad:

np.random.randint es el más rápido , seguido de np.random.uniform y random.randrange . random.randint es el más lento .

► Tanto np.random.randint como np.random.uniform son mucho más rápidos (~ 8 - 12 veces más rápidos) que random.randrange y random.randint .

%timeit np.random.randint(low=0, high=10, size=(15,))
>> 1.64 µs ± 7.83 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

%timeit np.random.uniform(low=0, high=10, size=(15,)).astype(int)
>> 2.15 µs ± 38.6 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

%timeit [randrange(10) for i in range(15)]
>> 12.9 µs ± 60.4 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

%timeit [randint(0, 9) for i in range(0, 15)]
>> 20 µs ± 386 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

Notas:

1.> np.random.randint genera enteros aleatorios durante el intervalo medio abierto [bajo, alto].

2.> np.random.uniform genera números distribuidos uniformemente en el intervalo medio abierto [bajo, alto].

3.> random.randrange (stop) genera un número aleatorio a partir del rango (inicio, parada, paso).

4.> random.randint (a, b) devuelve un entero aleatorio N tal que a <= N <= b.

5.> astype (int) convierte la matriz numpy en el tipo de datos int.

6.> He elegido size = (15,). Esto le dará una matriz numpy de longitud = 15.

Siddharth Satpathy
fuente
¿Cómo %timeitfunciona en su entorno?
Cadoiz
18

En el caso de números continuos randinto randrangeson probablemente las mejores opciones, pero si tiene varios valores distintos en una secuencia (es decir, a list) también podría usar choice:

>>> import random
>>> values = list(range(10))
>>> random.choice(values)
5

choice También funciona para un elemento de una muestra no continua:

>>> values = [1, 2, 3, 5, 7, 10]
>>> random.choice(values)
7

Si lo necesita "criptográficamente fuerte" también hay un secrets.choicepython 3.6 y más reciente:

>>> import secrets
>>> values = list(range(10))
>>> secrets.choice(values)
2
MSeifert
fuente
¿Qué pasa si queremos más números de la secuencia?
Gunjan naik
Si deben ser sin reemplazo: random.sample. Con el reemplazo, puede usar una comprensión con choice: por ejemplo, para una lista que contiene 3 valores aleatorios con reemplazo:[choice(values) for _ in range(3)]
MSeifert
18

Mientras que muchos puestos demuestran cómo conseguir un número entero aleatorio, la pregunta original se pregunta cómo generar entero aleatorio s (plural):

¿Cómo puedo generar enteros aleatorios entre 0 y 9 (inclusive) en Python?

Para mayor claridad, aquí demostramos cómo obtener múltiples enteros aleatorios.

Dado

>>> import random


lo = 0
hi = 10
size = 5

Código

Múltiples enteros aleatorios

# A
>>> [lo + int(random.random() * (hi - lo)) for _ in range(size)]
[5, 6, 1, 3, 0]

# B
>>> [random.randint(lo, hi) for _ in range(size)]
[9, 7, 0, 7, 3]

# C
>>> [random.randrange(lo, hi) for _ in range(size)]
[8, 3, 6, 8, 7]

# D
>>> lst = list(range(lo, hi))
>>> random.shuffle(lst)
>>> [lst[i] for i in range(size)]
[6, 8, 2, 5, 1]

# E
>>> [random.choice(range(lo, hi)) for _ in range(size)]
[2, 1, 6, 9, 5]

Muestra de enteros aleatorios

# F
>>> random.choices(range(lo, hi), k=size)
[3, 2, 0, 8, 2]

# G
>>> random.sample(range(lo, hi), k=size)
[4, 5, 1, 2, 3]

Detalles

Algunas publicaciones demuestran cómo generar nativamente múltiples enteros aleatorios. 1 Aquí hay algunas opciones que abordan la pregunta implícita:

Vea también la charla de R. Hettinger sobre Chunking and Aliasing usando ejemplos del randommódulo.

Aquí hay una comparación de algunas funciones aleatorias en la Biblioteca estándar y Numpy:

| | random                | numpy.random                     |
|-|-----------------------|----------------------------------|
|A| random()              | random()                         |
|B| randint(low, high)    | randint(low, high)               |
|C| randrange(low, high)  | randint(low, high)               |
|D| shuffle(seq)          | shuffle(seq)                     |
|E| choice(seq)           | choice(seq)                      |
|F| choices(seq, k)       | choice(seq, size)                |
|G| sample(seq, k)        | choice(seq, size, replace=False) |

También puede convertir rápidamente una de las muchas distribuciones en Numpy en una muestra de enteros aleatorios. 3

Ejemplos

>>> np.random.normal(loc=5, scale=10, size=size).astype(int)
array([17, 10,  3,  1, 16])

>>> np.random.poisson(lam=1, size=size).astype(int)
array([1, 3, 0, 2, 0])

>>> np.random.lognormal(mean=0.0, sigma=1.0, size=size).astype(int)
array([1, 3, 1, 5, 1])

1 A saber, @John Lawrence Aspden, @ST Mohammed, @SiddTheKid, @ user14372, @zangw, et al. 2 @prashanth menciona que este módulo muestra un número entero. 3 Demostrado por @Siddharth Satpathy

pylang
fuente
14

si quieres usar numpy, usa lo siguiente:

import numpy as np
print(np.random.randint(0,10))
sushmit
fuente
1
Se podría decir algo sobre "numpy".
Simón
11
Si. Gracias por el enlace. Pero tenía la intención de decir que podría haber mejorado su respuesta al proporcionar detalles antes de simplemente citar dos líneas de código; por qué razón alguien preferiría usarlo en lugar de algo ya incorporado. No es que esté obligado a hacerlo, de todos modos.
Simón
9
>>> import random
>>> random.randrange(10)
3
>>> random.randrange(10)
1

Para obtener una lista de diez muestras:

>>> [random.randrange(10) for x in range(10)]
[9, 0, 4, 0, 5, 7, 4, 3, 6, 8]
John Lawrence Aspden
fuente
7

Generando enteros aleatorios entre 0 y 9.

import numpy
X = numpy.random.randint(0, 10, size=10)
print(X)

Salida:

[4 8 0 4 9 6 9 9 0 7]
Ashok Kumar Jayaraman
fuente
6

random.sample es otro que se puede usar

import random
n = 1 # specify the no. of numbers
num = random.sample(range(10),  n)
num[0] # is the required number
prashanth
fuente
6

La mejor manera es usar la función Importar al azar

import random
print(random.sample(range(10), 10))

o sin ninguna importación de biblioteca:

n={} 
for i in range(10):
    n[i]=i

for p in range(10):
    print(n.popitem()[1])

aquí los popitems eliminan y devuelven un valor arbitrario del diccionario n.

ST Mohammed
fuente
3

Este es más un enfoque matemático, pero funciona el 100% del tiempo:

Digamos que desea utilizar la random.random()función para generar un número entre ay b. Para lograr esto, solo haga lo siguiente:

num = (b-a)*random.random() + a;

Por supuesto, puedes generar más números.

Orestis Zekai
fuente
2

Desde la página de documentación para el módulo aleatorio :

Advertencia: los generadores pseudoaleatorios de este módulo no deben utilizarse con fines de seguridad. Use os.urandom () o SystemRandom si necesita un generador de números pseudoaleatorio criptográficamente seguro.

random.SystemRandom , que se introdujo en Python 2.4, se considera criptográficamente seguro . Todavía está disponible en Python 3.7.1, que es actual en el momento de la escritura.

>>> import string
>>> string.digits
'0123456789'
>>> import random
>>> random.SystemRandom().choice(string.digits)
'8'
>>> random.SystemRandom().choice(string.digits)
'1'
>>> random.SystemRandom().choice(string.digits)
'8'
>>> random.SystemRandom().choice(string.digits)
'5'

En lugar de string.digits, rangepodría usarse según algunas de las otras respuestas, tal vez con una comprensión. Mezcla y combina de acuerdo a tus necesidades.

rriehle
fuente
0

OpenTURNS permite no solo simular los enteros aleatorios sino también definir la distribución asociada con la UserDefinedclase definida.

Lo siguiente simula 12 resultados de la distribución.

import openturns as ot
points = [[i] for i in range(10)]
distribution = ot.UserDefined(points) # By default, with equal weights.
for i in range(12):
    x = distribution.getRealization()
    print(i,x)

Esto imprime:

0 [8]
1 [7]
2 [4]
3 [7]
4 [3]
5 [3]
6 [2]
7 [9]
8 [0]
9 [5]
10 [9]
11 [6]

Los corchetes están ahí porque xes un Pointen 1 dimensión. Sería más fácil generar los 12 resultados en una sola llamada a getSample:

sample = distribution.getSample(12)

produciría:

>>> print(sample)
     [ v0 ]
 0 : [ 3  ]
 1 : [ 9  ]
 2 : [ 6  ]
 3 : [ 3  ]
 4 : [ 2  ]
 5 : [ 6  ]
 6 : [ 9  ]
 7 : [ 5  ]
 8 : [ 9  ]
 9 : [ 5  ]
10 : [ 3  ]
11 : [ 2  ]

Más detalles sobre este tema están aquí: http://openturns.github.io/openturns/master/user_manual/_generated/openturns.UserDefined.html

Michael Baudin
fuente
-1

Tuve mejor suerte con esto para Python 3.6

str_Key = ""                                                                                                
str_RandomKey = ""                                                                                          
for int_I in range(128):                                                                                    
      str_Key = random.choice('0123456789')
      str_RandomKey = str_RandomKey + str_Key 

Simplemente agregue caracteres como 'ABCD' y 'abcd' o '^! ~ = -> <' para alterar el conjunto de caracteres para extraer, cambie el rango para alterar el número de caracteres generados.

MT Head
fuente