Nieoznaczone karpi

Nieoznaczone karpi
I4
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 4
0

W stawie pływa 10 karpi. 4 z nich zostało złapanych, oznakowanych i zwolnionych. 7 karpi złowionych po raz drugi. Znajdź prawdopodobieństwo, że wszystkie złowione karpie są nieoznaczone.

Na ile rozumiem odpowiedź jest 0, ponieważ jest tylko sześć nieoznaczonych ryb, ale w jaki sposób mogę to zapisać w Python?

Riddle
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 10227
1
incognito41 napisał(a):

W stawie pływa 10 karpi. 4 z nich zostało złapanych, oznakowanych i zwolnionych. 7 karpi złowionych po raz drugi. Znajdź prawdopodobieństwo, że wszystkie złowione karpie są nieoznaczone.

Na ile rozumiem odpowiedź jest 0, ponieważ jest tylko sześć nieoznaczonych ryb, ale w jaki sposób mogę to zapisać w Python?

Tylko jedna rzeczy mi przychodzi do głowy, czyli to. Nie wiem co dokładnie miałby robić ten program który miałbys napisac.

Kopiuj
probability = 0

Pamiętaj że języki programowania są przede wszystkim do tego żeby wykonywać obliczenia i operacje, więc co dokładniej Twój program miałby robić? Wypisywać liczbę 0?

Riddle
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 10227
0
incognito41 napisał(a):

Musi obliczyć prawdopodobieństwo. Ale w jaki sposób muszę napisać ten (?postęp, obliczenie?) prawdopodobieństa, gdy końcowa odpowiedź jest 0.

No, to masz dwa wyjścia:

  • Albo uznajemy że wiesz, że końcowy wynik tego "obliczenia" jest równy 0, i po prostu piszesz return 0 (bo żadne obliczenia nie są konieczne zeby to zrobić)
  • Albo uznajemy że nie wiesz, że końcowy wynik to 0, i całkowicie pomijasz ten fakt i w jakiś sposób ustalasz prawdopodobieństwo. Albo podstawiasz do wzoru, albo robisz symulację, np:
    • robisz array z 10 karpiami (powiedzmy dziesięć razy False)
    • cztery z nich randomowo oznaczasz np na True, albo inaczej, żeby oznaczyć że są złapane
    • wyciągasz 7 randomowych z nich i sprawdzasz czy są True czy False
      • jak wszystkie 7False, to robisz success += 1, jeśli nie to failure += 1, iterujesz to powiedzmy 1000 razy (musi z tego wyjśc success=0, failure=1000, ale udajemy że nie wiemy tego)
      • Wyciągasz success / (success + failure), i to jest Twoje prawdopodobieństwo (które w tym przypadku musi się równać 0, bo success będzie 0, ale udajemy że nie wiemy tego)
incognito41 napisał(a):

Na ile rozumiem odpowiedź jest 0, ponieważ jest tylko sześć nieoznaczonych ryb, ale w jaki sposób mogę to zapisać w Python?

Pytanie co chcesz zrobić tak na prawdę, bo program który zwraca zawsze tą samą daną jest bez sensu.

Jak dla mnie - pytanie zupełnie bez sensu.

KamilAdam
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Silesia/Marki
  • Postów: 5550
0
Riddle napisał(a):
  • Albo uznajemy że nie wiesz, że końcowy wynik to 0, i całkowicie pomijasz ten fakt, czyli:
    • robisz array z 10 karpiami (powiedzmy dziesięć razy False)
    • cztery z nich randomowo oznaczasz np na True, albo inaczej, żeby oznaczyć że są złapane
    • wyciągasz 7 randomowych z nich i sprawdzasz czy są True czy False
      • jak wszystkie 7False, to robisz success += 1, jeśli nie to failure += 1, iterujesz to powiedzmy 1000 razy (musi z tego wyjśc success=0, failure=1000, ale udajemy że nie wiemy tego)
      • Wyciągasz success / (success + failure), i to jest Twoje prawdopodobieństwo (które w tym przypadku musi się równać 0, bo success będzie 0, ale udajemy że nie wiemy tego)

Hm, zadanie jak mówi @Riddle bez sensu, ale ja bym nie robił tego metodą monte carlo, tylko bardziej zastanowił się jakie jest prawdopodobieństwo p kiedy karpi jest n, za pierwszym razem wyciągamy x1 a za drugim razem x2. Zapisał na to wzór matematycznie, a potem przetłumaczył na pythona. Niestety matematyki już nie umiem (albo umiem i nie mam czasu), ale jak już wyliczycie wzory na to to mogę do przepisać do pythona

DA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 176
2
Kopiuj
if (input == 'W stawie pływa 10 karpi. 4 z nich zostało złapanych, oznakowanych i zwolnionych. 7 karpi złowionych po raz drugi. Znajdź prawdopodobieństwo, że wszystkie złowione karpie są nieoznaczone.')
  return 0
Wilktar
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 82
0

Pisanie programów które na sztywno mają określone parametry jest bez sensu. Piszemy programy właśnie po to żeby można było podawać różne dane.

Jeżeli dobrze pamiętam to prawdopodobieństwo wydarzeń które muszą zajść można policzyć jako iloczyn, ale potestuj ten program :)

Kopiuj
marked = int(input())
count = int(input())
trials = int(input())

probality = 1
for i in range(trials):
    probality *= (count- marked)/count 
    print("Probability in step " + str(i) + " " + str(probality));
    count-=1

print("Probability: " + str(probality))

W takim przypadku w kroku 6 prawdopodobieństwo wynosi 0 więc cały iloczyn wynosi 0.

Kopiuj
Probability in step 0 0.6
Probability in step 1 0.3333333333333333
Probability in step 2 0.16666666666666666
Probability in step 3 0.07142857142857142
Probability in step 4 0.023809523809523808
Probability in step 5 0.004761904761904762
Probability in step 6 0.0
Probability: 0.0
Spearhead
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1007
0

A może w zadaniu chodzi o to by przeiterować mozolnie po wszystkich kombinacjach...?

Kopiuj
import itertools


class Fish:
    def __init__(self, marked=False):
        self.marked=marked

fishes = []
for i in range(4):
    fishes.append(Fish(marked=True))
for i in range(6):
    fishes.append(Fish())


counter = 0
all_unmarked = 0
for i in itertools.combinations(fishes, 7):
    counter += 1
    if all(not f.marked for f in fishes):
        ull_unmarked += 1

print(f"Found {counter} combinations")
print(f"Found {all_unmarked} combinations with all fishes unmarked")
print(f"Probability is {all_unmarked/counter}")
SL
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1023
0

Ewentualnie mógłbyś się pokusić o zapisanie warunku z https://pl.wikipedia.org/wiki/Zasada_szufladkowa_Dirichleta

Kopiuj
m = 7
n = 6
if m > n:
  print("0")
else:
  print("cholera wie, trzeba innej metody")
I4
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 4
0

Niezmiernie dziękuję dla każdego! Będę miał produktywny wieczór z analizą każdego przykładu! Pozdrawiam:)

Paweł Biernacki
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 181
0
Kopiuj
def silnia(x): return 1 if x<=1 else x*silnia(x-1)
def newton(n,k): return (int)(silnia(n)/(silnia(k)*silnia(n-k)))
def p(all,marked,all_chosen,marked_and_chosen): 
  return newton(all-marked,all_chosen-marked_and_chosen)*newton(marked,marked_and_chosen)/newton(all,all_chosen)
for x in range(8):
  print("for x=",x," p(10,4,7,x)=",p(10,4,7,x))

Ten program wypisze:

Kopiuj
for x= 0 p(10,4,7,x)= 0.0
for x= 1 p(10,4,7,x)= 0.03333333333333333
for x= 2 p(10,4,7,x)= 0.3
for x= 3 p(10,4,7,x)= 0.5
for x= 4 p(10,4,7,x)= 0.16666666666666666
for x= 5 p(10,4,7,x)= 0.0
for x= 6 p(10,4,7,x)= 0.0
for x= 7 p(10,4,7,x)= 0.0

Interesujəcy Cię przypadek to ostatni wynik - p(10,4,7,7), rzeczywiście to niemożliwe. Ciekawe jest też, że nie może to być sześć oznaczonych karpi, ani pięć. Gdybyśmy na siedem wylosowanych mieli dokładnie sześć oznaczonych, tyle ich nie ma. Podobnie gdybyśmy na siedem wylosowanych mieli dokładnie pięć oznaczonych - to też jest niemożliwe.

SI
  • Rejestracja: dni
  • Ostatnio: dni
0

A co jak karpie po odłowieniu po raz drugi też są zwalniane, a co za tym idzie można złowić kila razy tego samego?

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.