2011-09-27 21 views
19

He tomado una cuenta de algo y salió a NPython: ¿Cómo hacer una lista de n números y seleccionar al azar cualquier número?

Ahora me gustaría tener una lista, que contiene de 0 a N números. Ejemplo: N = 5 entonces, count_list = [1, 2, 3, 4, 5]

¿cómo iba a ser capaz de hacer eso?

Además, una vez que haya creado la lista, me gustaría seleccionar al azar 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 usar eso también. Esto pasa, la lista está vacía. ¿alguien podría ayudarme con esto? Gracias

+0

Su lista contiene 1 a N, no es cero a través N. –

+0

¿Qué tan grande qué se puede esperar que N sea? 10? 10^8? Esto importa; todas las respuestas proporcionadas suponen O (N) complejidad del espacio ... ¿estás seguro de que quieres esto? En su pregunta, usted es bastante explícito al decir "Ahora me gustaría tener una lista", pero quería asegurarme de que se dio cuenta de lo que esto significa. –

+0

Nunca pensé tan profundo. En realidad estaba buscando una lista en la que N es máx. De 20 a 30. Pero ya que lo mencionaste, como ejercicio de aprendizaje para mí, ¿podrías ayudarme con lo siguiente? 1. ¿Cuál es la complejidad del espacio O (N)? 2, ¿qué pasa cuando mi lista es de aproximadamente 10^8 – Sunny

Respuesta

30

Puede crear la enumeración de los elementos por algo así:

mylist = list(xrange(10)) 

continuación, puede utilizar la función random.choice para seleccionar sus artículos:

import random 
... 
random.choice(mylist) 

EDIT:

Como Asim Ihsan declaró correctamente, mi respuesta aún no aborda el problema completo del PO. Para quitar los valores de la lista, simplemente list.remove() pueden ser llamados:

import random 
... 
value = random.choice(mylist) 
mylist.remove(value) 
7

Puede 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' 
+1

'while count_list:' es suficiente para probar si 'count_list' no es una lista vacía ... – eumiro

0

Crear la lista (editado):

count_list = range(1, N+1) 

Seleccione elemento aleatorio:

import random 
random.choice(count_list) 
+0

' [x + 1 para x en xrange (N)] == rango (1, N + 1) ' –

+0

@larsmans el primero produce una lista, la última - un iterador –

+0

Edité mi comentario para usar 'range'. –

1

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 a la segunda, lee esto: http://docs.python.org/library/random.html

>>> 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, que también podría estar interesado en leer este:

http://code.activestate.com/recipes/59883-random-selection-of-elements-in-a-list-with-no-rep/

Hay algunas implementaciones de selección aleatorio rápido.

1

No es necesario contar cosas si usted quiere recoger un elemento aleatorio. Sólo tiene que utilizar random.choice() y pasar su iterable:

import random 
items = ['foo', 'bar', 'baz'] 
print random.choice(items) 

Si realmente tiene que contar con ellos, utilizar random.randint(1, count+1).

1

Se puede utilizar:

import random 
random.choice(range(n)) 

o:

random.choice(range(1,n+1)) 

si quieres que 1-n y no de 0.

1

Después de eso, me gustaría seleccionar otro número de los números restantes de la lista (N-1) y luego usar eso también.

Entonces podría decirse que en realidad no quieren crear una lista de números de 1 a N sólo con el propósito de recoger una (¿por qué no pedir un número aleatorio en ese rango directamente, en vez de forma explícita la creación a elegir?), pero en lugar de mezclar tal lista. Afortunadamente, el módulo random también lo tiene cubierto: simplemente use random.shuffle.

Por supuesto, si tiene una gran lista de números y solo desea dibujar algunos, entonces tiene sentido dibujar cada uno usando random.choice y eliminarlo.

Pero ... ¿por qué quiere seleccionar números de un rango, que corresponde al recuento de algunos elementos? ¿Vas a usar el número para seleccionar uno de los artículos? No hagas eso; eso está saliendo de tu camino para complicar las cosas. Si desea seleccionar uno de los elementos, hágalo directamente, de nuevo con random.choice.

0

maitain a set y eliminar el elemento recogido 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 annswers 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([]) 
Cuestiones relacionadas