2011-12-14 12 views
30

Moje pytanie brzmi: Jak wygenerować niepowtarzalne liczby losowe w numpy?Niepowtarzalna liczba losowa w numpy

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

Co masz na myśli przez "niepowtarzalny"? Że ciąg liczb losowych nigdy się nie powtórzy? Nie jest to możliwe, ponieważ stan generatora liczb losowych musi pasować do skończonej pamięci komputera. Czy masz na myśli, że żadna pojedyncza liczba nie występuje dwukrotnie? –

+3

Nie powtórzenie oznacza, że ​​masz listę bez duplikatów. – Polynomial

+1

Być może potrzebujesz losowej permutacji? http://docs.scipy.org/doc/numpy/reference/generated/numpy.random.permutation.html – cyborg

Odpowiedz

40

Jeśli nie nalegać na użyciu numpy można użyć random.sample() z biblioteki standardowej:

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

Z NumPy, trzeba będzie użyć numpy.random.shuffle() i krojenia:

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

print random.sample (range (20), 10) nie działa z pythonem 2.6 ?! – Academia

+1

@ user1038382: Działa dla mnie. Co oznacza "nie działa"? –

+0

Daje mi ten błąd: "niezdefiniowana zmienna: losowa" – Academia

-2

prostu utworzy tablicę, która zawiera żądany zakres numerów, a następnie losowo je wielokrotnie wymiany losowo jeden z 0th elementu tablicy. Powoduje to losową sekwencję, która nie zawiera zduplikowanych wartości.

+1

Inną właściwością wynikowej losowej sekwencji jest to, że [nie jest szczególnie przypadkowa] (http: //www.codinghorror .com/blog/2007/12/the-danger-of-naivete.html). –

+0

@SvenMarnach - Dla większości celów jest to jednak dość przypadkowe. Mógłby użyć podejścia podwójnie losowego, gdyby chciał, żeby był bardziej losowy. – Polynomial

+0

To jest bezcelowe. OP może korzystać z wywołań biblioteki, aby zrobić to dobrze. Są łatwiejsze w użyciu, działają szybciej i są bardziej czytelne niż wersja niestandardowa. Nie mogę wymyślić żadnego powodu, dla którego powinienem użyć niewłaściwego algorytmu właśnie dlatego, że jest on prawdopodobnie "dość przypadkowy", kiedy użycie odpowiedniego algorytmu nie ma żadnej wady. –

43

I myśl numpy.random.sample nie działa poprawnie, teraz. To jest mój sposób:

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

Zamiast 'range (n)' (lub 'arange (n)') jako pierwszego argumentu 'choice', jest równoznaczne z przekazaniem' n', np. 'choice (20, 10, replace = False)'. –