Bu kodun sona ermesi ihtimali nedir?


10

Bu Python kodu yazmış ve bazen merak basitçe değil sonlandırmak (biz sonsuz bellek / zaman ve hiçbir yineleme derinliği sınırı vardı varsayarak).

Sezgisel olarak sona erdiğini düşünürsünüz, çünkü bir noktada şanslı olmalısınız ve eğer sona ermezse şanslı olmak için sonsuz zamanınız vardır. Öte yandan, özyineleme derinliği arttıkça katlanarak daha şanslı olmalısınız.

import random

def random_tree():
    if random.random() < 0.5:
        return 0
    return [random_tree() for _ in range(random.randint(1, 5))]

Her random_treezaman sona ermezse, neden ve sona ermesi olasılığı nedir?

P=1-(1-0.5)(1-(P+P2+P3+P4+P5)/5)0.6841241

Muhtemelen daha karmaşık, ama aynı zamanda bana da ilgi çeken, için sonlandırma şansı nedir :P(bir,b)

def random_tree(a, b):
    if random.random() < a:
        return 0
    return [random_tree(a, b) for _ in range(random.randint(1, b))]

Veya sözde kodda:

random_tree(a, b) is a function that either:
    - returns 0 with probability a
    - returns a list containing the results of 1 to b
      (uniformly chosen from this inclusive range) recursive calls

random_tree(a, b):
    if rand() < a # rand() is a random real on [0, 1)
        return 0
    list = []
    len = randint(1, b) # uniform random integer from 1 to b inclusive
    do len times
        append random_tree(a, b) to list
    return list

1
@DavidRicherby En altına eklendi. Üstteki kod basittir random_tree(0.5, 5).
16:22, orlp

Bu bir dallanma süreci olarak bilinir. Cevabı bulmak için yukarıya bakın.
Yuval Filmus

Yanıtlar:


8

1.25>1


1

Böylece çıkıyor. Bu kök, hiç başlamazsanız sürecin tükenmiş olduğu gerçeğini ifade eder. Örneğin Feller tarafından ele alınan bu klasik konuda biraz okuma yapmanızı öneririm.
Yuval Filmus
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.