Potrzebuję próbki, bez wymiany, spośród wszystkich możliwych krotek liczb od range(n)
. Oznacza to, że mam kolekcję (0,0), (0,1), ..., (0, n), (1,0), (1,1), ..., (1, n), ..., (n, 0), (n, 1), (n, n) i próbuję pobrać próbkę k tych elementów. Mam nadzieję, że nie będę wyraźnie budować tej kolekcji.python: pobieranie próbek bez zamiany z siatki 2D
Wiem, że random.sample(range(n), k)
jest prosty i efektywny, gdy potrzebuję próbki z sekwencji liczb, a nie krotek liczb.
Oczywiście, mogę jawnie zbudować listę zawierającą wszystkie możliwe krotki (n * n = n^2
), a następnie zadzwonić pod numer random.sample
. Ale to prawdopodobnie nie jest wydajne, jeśli k
jest znacznie mniejsze niż n^2
.
Nie jestem pewien, czy rzeczy działają tak samo w Pythonie 2 i 3 pod względem wydajności; Używam Pythona 3.
krotki są sekwencjami, więc zdanie „potrzebował próbkę z sekwencji liczb zamiast krotek liczb.” nie ma sensu. Masz na myśli, że potrzebujesz próbki z sekwencji krotek? W tym przypadku nie jest jasne, jak te krotki wyglądają. –
Twój kod ('random.sample (range (n), k)' działa i jest poprawny dla wszystkich sekwencji, krotek, list, ciągów znaków i dowolnej podklasy 'collections.Sequence'. Czy próbowałeś już swojego kodu? ? –
@Regebro: 'próbka z krotek' = 'próbka k krotek z sekwencji n krotek'. "próbka z sekwencji" = "próbka k elementów z sekwencji n elementów". Zamierzam edytować pytanie, by wyjaśnić. @ S.Lott: Chciałem powiedzieć, że nie mogę odnieść się do sekwencji ((0,0), (0,1), (0,2), (1,0), (1,1) , (1,2), (2,0), (2,1), (2,2)) jako prosty "zakres", na którym mogę po prostu zastosować "próbkę". – max