2017-06-30 2 views
1

私は誕生日のパラドックス計算するプログラムを作成しようとしています:return文は何をしますか?

import random 

def random_birthdays(): 
    count = 0 
    res = [] 
    for i in range(23): 
     res.append(random.randint(0, 365)) 
    res.sort() 
    return res 

def final(): 
    count = 0 
    i = 0 
    random_birthdays() 
    for day in res: 
     if res[i] == res[i + 1]: 
      count = count + 1 
      i = i + 1 
     else: 
      i = i + 1 
    return count 

def percentage(): 
    happens = 0 
    for i in range(100): 
     final() 
     happens = happens + count 
    percentage = happens/100 

percentage() 

しかし、私はこのエラーを取得しています:for day in res: res not definedを。

私はPythonの復帰部分を理解している方法が本当に間違っていると思います。私はそれを見て、resを返して、それを次の行の変数として使用する必要があるからです。

+2

あなたは値ではなく、変数を返します。 'random_birthdays()'は '2 + 2'のように評価される式です。これは整数に評価される式です。結果で何かをする必要があります(変数に格納するなど)。 – Ryan

+1

'return res'は、呼び出し側が使用できる' res'変数を持つことを意味しません。 'return'は変数ではなくオブジェクトを返します。呼び出し元が返されたオブジェクトを変数に保存したい場合は、呼び出し側がそれを行う必要があります。 – user2357112

+0

変数resを割り当てたことはありません。関数は 'res'の値を返しますが、シンボルは保持しません。 'random_birthdays'関数を終了すると、シンボルは意味を持ちません。返された値を新しいシンボルに代入する必要があります( 'res'は再利用できます)。ループの前の行を 'res = random_birthdays()'に変更してください。 – Zinki

答えて

0

ようこそ!

returnには、返された値をobjectに格納する必要があります。

def final(): 
     count = 0 
     i = 0 
     res = random_birthdays() 
     for day in res: 
      if res[i] == res [i+1]: 
       count = count +1 
       i = i+1 
      else: 
       i = i+1 
     return count 
+1

残っている呼び出しがあります。 – Ryan

+1

ありがとうございます。今私はそれを参照してください –

0

書き換えのビット:

from collections import Counter 
from math import factorial 
from random import randrange 

def duplicate_birthday(n): 
    """ 
    Given n people with random birthdays, 
     do any of them share a birthday? 
    """ 
    c = Counter(randrange(365) for _ in range(n)) 
    return max(c.values()) > 1 

def monte_carlo(n, tries = 1000): 
    return sum(1 for _ in range(tries) if duplicate_birthday(n))/tries 

def calculated_odds(n): 
    """ 
    Given n people with random birthdays, 
    calculate the odds that at least two share a birthday 
    """ 
    all_combos = 365 ** n 
    unique_combos = factorial(365)/factorial(365 - n) 
    return 1. - unique_combos/all_combos 

def main(): 
    print("Odds of N people sharing a birthday:") 
    for n in range(20, 26): 
     sim_pct = 100. * monte_carlo(n) 
     calc_pct = 100. * calculated_odds(n) 
     print("{:>2d}: {:>4.1f}% ({:>4.1f}%)".format(n, sim_pct, calc_pct)) 

if __name__ == "__main__": 
    main() 

与え

Odds of N people sharing a birthday: 
20: 42.5% (41.1%) 
21: 42.0% (44.4%) 
22: 48.8% (47.6%) 
23: 50.7% (50.7%) 
24: 52.2% (53.8%) 
25: 55.9% (56.9%)   
関連する問題