Nie rozumiem polecenia

0

Mógłby ktoś wytłumaczyć mi o co chodzi w tym zadaniu:

Napisz funkcję randperm(n) która losuje permutację liczb od 0 do n − 1 (czyli ma
zwracać wylosowaną listę o długości n zawierającą wszystkie liczby z zadanego przedziału). Przygotuj
prezentację tej funkcji, która wypisuje kilka losowych permutacji dla liczb z przedziału od 0 do 9.
Nie wolno korzystać z funkcji shuffle z modułu random. Za to zadanie można dostać premię 0.5p
(nie wliczającą się do maksimum), jeżeli funkcja randperm będzie poprawna, będzie losować każdą
permutację z tym samym prawdopodobieństwem, a ponadto x = randperm(10 ** 6) wykona się w
kilka sekund

1

A której części nie rozumiesz?

  1. Nie wiesz co to permutacja?
  2. Nie wiesz co to funkcja?
  3. Nie wiesz co to losowanie z przedziału?
  4. Nie wiesz co to prawdopodobieństwo?
  5. Nie wiesz co to kilka sekund?
0

Czy ten kod spełnia tę część zadania Napisz funkcję randperm(n) która losuje permutację liczb od 0 do n − 1 (czyli ma
zwracać wylosowaną listę o długości n zawierającą wszystkie liczby z zadanego przedziału). Przygotuj
prezentację tej funkcji, która wypisuje kilka losowych permutacji dla liczb z przedziału od 0 do 9.?

import random

def randperm(n):
    L = []
    for i in range(n):
        while 1:
            tmp = random.randint(0,n-1)
            if tmp not in L:
                L.append(tmp)
                break    
    return L

for i in range (10):
    print(randperm(10))


2

Z biedą cośtam spełnia ale złożoność masz O(nieskończoność) i jakby ktoś chciał wygenerować permutacje miliona liczb to sie pewnie nigdy nie policzy bo jak masz już 999 999 liczb w liscie to szansa ze randint wylosuje tą brakującą jest 1:miliona. Powodzenia :D I jeszcze sprawdzasz czy element jest w liscie co wymaga liniowego przeszukiwania. Już by się set() do tego lepiej nadawał...
Zalecałbym jednak utworzyć listę wszystkich liczb a potem ją pomieszać jakoś sprytnie.

0

Napisałem coś takiego, lecz prędkość tego programu nie jest powalająca jak można by go przyspieszyć?

import random

def losuje(L,n):
    res = []
    tmp = n
    for i in range (n):
        x = random.randint(0, tmp-1)
        res.append(L[x])
        L.remove(L[x])
        tmp -= 1  
    return res
        
n=100000
L = []
for i in range (n):
    L.append(i)

L = losuje(L,n)
print(L)



0

Bardzo szybkie (poniżej 2 sekund) i zgodne z literą prawa - nie korzysta z shuffle - (ale chyba niezgodne z duchem prawa) jest takie rozwiązanie:

import random

def randperm(n):
    return random.sample(range(n),n)
#dla kontroli
result =  randperm(10**6)
print(result)
3

prawdopodobnie chodzi o "Fisher–Yates shuffle" https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle

1 użytkowników online, w tym zalogowanych: 0, gości: 1