2011-12-14 15 views
30

Mi pregunta es: ¿Cómo puedo generar números aleatorios no repetitivos en numpy?Número aleatorio no repetitivo en numpy

list = np.random.random_integers(20,size=(10)) 
+0

¿Qué quiere decir con "no repetitivo"? Que la secuencia de números aleatorios nunca se repite? Esto no es posible, ya que el estado del generador de números aleatorios debe caber en la memoria finita de una computadora. ¿O quiere decir que no hay un solo número aparece dos veces? –

+3

No repetitivo significa que tiene una lista sin duplicados. – Polynomial

+1

¿Quizás necesites una permutación aleatoria? http://docs.scipy.org/doc/numpy/reference/generated/numpy.random.permutation.html – cyborg

Respuesta

40

Si no insiste en usar NumPy, puede utilizar random.sample() de la librería estándar:

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

Con NumPy, tendrá que utilizar numpy.random.shuffle() y rebanar:

a = numpy.arange(20) 
numpy.random.shuffle(a) 
print a[:10] 
+0

print random.sample (rango (20), 10) no funciona con Python 2.6 ?! – Academia

+1

@ user1038382: Funciona para mí. ¿Qué significa "no funciona"? –

+0

Me da este error: "variable indefinida: al azar" – Academia

-2

generar simplemente una matriz que contiene el rango requerido de números, barajar ellos mediante el canje repetidamente al azar con el elemento 0 ª en la matriz. Esto produce una secuencia aleatoria que no contiene valores duplicados.

+1

Otra propiedad de la secuencia aleatoria resultante es que [no es particularmente aleatorio] (http: //www.codinghorror) .com/blog/2007/12/the-danger-of-naivete.html). –

+0

@SvenMarnach - Para la mayoría de los propósitos, sin embargo, es lo suficientemente aleatorio. Podría usar el enfoque doblemente aleatorio si lo quisiera más al azar. – Polynomial

+0

Esto no tiene sentido. El OP puede usar llamadas de la biblioteca para hacerlo bien. Son más fáciles de usar, funcionan más rápido y son más legibles que una versión personalizada. No puedo pensar en ninguna razón por la que deba usar un algoritmo incorrecto aquí simplemente porque es probablemente "lo suficientemente aleatorio", cuando usar el algoritmo correcto no tiene ninguna desventaja en absoluto. –

43

I Creo que numpy.random.sample no funciona bien, ahora. Esta es mi manera:

import numpy as np 
np.random.choice(range(20), 10, replace=False) 
+10

En lugar de 'range (n)' (o 'arange (n)') como el primer argumento de 'choice', es equivalente a simplemente pasar' n', p. Ej. 'elección (20, 10, reemplazar = Falso)'. –

Cuestiones relacionadas