python - from - randrange
¿Cómo hacer una lista de n números en Python y seleccionar aleatoriamente cualquier número? (8)
He tomado una cuenta de algo y salió a N.
Ahora me gustaría tener una lista con números de 0 a N en ella.
Ejemplo:
N = 5
entonces, count_list = [1, 2, 3, 4, 5]
¿Cómo podría hacer eso?
Además, una vez que haya creado la lista, me gustaría seleccionar aleatoriamente un número de esa lista y usar ese número.
Después de eso, me gustaría seleccionar otro número de los números restantes de la lista (N-1) y luego usarlo también.
Esto va en la lista está vacía.
¿Cómo puedo hacer esto?
Después de eso, me gustaría seleccionar otro número de los números restantes de la lista (N-1) y luego usarlo también.
Entonces, podría decirse que realmente no desea crear una lista de números del 1 al N con el único fin de elegir uno (¿por qué no pedir un número aleatorio en ese rango directamente, en lugar de crearlo explícitamente para elegir?), Pero en lugar de barajar tal lista. Afortunadamente, el módulo random
tiene cubierto: solo use random.shuffle
.
Por supuesto, si tienes una gran lista de números y solo quieres dibujar unos pocos, entonces ciertamente tiene sentido dibujar cada uno usando random.choice
y eliminarlo.
Pero ... ¿por qué desea seleccionar números de un rango que corresponda al recuento de algunos elementos? ¿Vas a utilizar el número para seleccionar uno de los elementos? No hagas eso eso está haciendo todo lo posible para hacer las cosas demasiado complicadas. Si desea seleccionar uno de los elementos, hágalo directamente - nuevamente con random.choice
.
Crear la lista (editada):
count_list = range(1, N+1)
Seleccionar elemento aleatorio:
import random
random.choice(count_list)
En cuanto a la primera parte:
>>> N = 5
>>> count_list = [i+1 for i in xrange(N)]
>>> count_list
[1, 2, 3, 4, 5]
>>>
En cuanto al segundo, lee 9.6. aleatorio - Genera números pseudoaleatorios .
>>> from random import choice
>>> a = choice(count_list)
>>> a
1
>>> count_list.remove(a)
>>> count_list
[2, 3, 4, 5]
Esa es la idea general.
Por cierto, puede que también te interese leer una selección aleatoria de elementos en una lista, sin repeticiones (receta de Python) .
Hay algunas implementaciones de selección aleatoria rápida.
Mantenga un set
y elimine un elemento seleccionado aleatoriamente (con choice
) hasta que la lista esté vacía:
s = set(range(1, 6))
import random
while len(s) > 0:
s.remove(random.choice(list(s)))
print(s)
Tres carreras dan tres respuestas diferentes:
>>>
set([1, 3, 4, 5])
set([3, 4, 5])
set([3, 4])
set([4])
set([])
>>>
set([1, 2, 3, 5])
set([2, 3, 5])
set([2, 3])
set([2])
set([])
>>>
set([1, 2, 3, 5])
set([1, 2, 3])
set([1, 2])
set([1])
set([])
No necesitas contar cosas si quieres elegir un elemento aleatorio. Solo usa random.choice()
y pasa tu iterable:
import random
items = [''foo'', ''bar'', ''baz'']
print random.choice(items)
Si realmente tiene que contarlos, use random.randint(1, count+1)
.
Puedes crear la enumeración de los elementos por algo como esto:
mylist = list(xrange(10))
Luego puedes usar la función random.choice
para seleccionar tus artículos:
import random
...
random.choice(mylist)
Como Asim Ihsan declaró correctamente, mi respuesta no abordó el problema completo del OP. Para eliminar los valores de la lista, simplemente se puede llamar a list.remove()
:
import random
...
value = random.choice(mylist)
mylist.remove(value)
Como señaló Takataka, la función incorporada xrange
se renombró a range
en Python 3.
Puedes probar este código
import random
N = 5
count_list = range(1,N+1)
random.shuffle(count_list)
while count_list:
value = count_list.pop()
# do whatever you want with ''value''
Puedes usar:
import random
random.choice(range(n))
o:
random.choice(range(1,n+1))
Si lo quieres de 1
a n
y no de 0
.