3

Python で誕生日プログラムを実行しようとしています。Python初心者なので困っています。

  1. リスト l を受け取り、重複する要素がある場合は True を返し、ない場合は False を返す関数duplicates(l) 。
  2. 関数test(count)は、 1 から 365 までのランダム整数countのリストを生成します。関数 duplicates(l) は重複をテストします。
  3. 関数probability(count, num)は、 count人のnum個のテストを実行し、重複のあるテストの数をカウントします。重複のあるテストの割合 (重複の数を num で割った値) を返します。

結果は次のようになります。

2人なら誕生日が2回ある確率は0.002。

3人なら誕生日が2回ある確率は0.008。等々...


ステップ2と3で立ち往生:

import random

# not sure what to put for count
count = [random.randint(1, 365)]

def duplicates(l):
    if len(l)!=len(set(l)):
        return True
    else:
        return False

def test(count):
    return [random.randint(1, 365)]

#def probability(count,num):

ステップ 1 は正しく行ったと思いますが、ここからどこに進むべきかわかりません。

4

2 に答える 2

4

このようなリストを作成する必要があります。testあまり便利な名前ではありません。make_birthday_list代わりに次のようなものを検討してください

def test(count):
    return [random.randint(1, 365) for x in range(count)]

重複したテストはすでにブール値に評価されているため、これを実行できます。変数名として使用するのはお勧めできませんl(あまりにも似ています1) ので、次のように変更しました。the_list

def duplicates(the_list):
    return len(the_list)!=len(set(the_list))

確率を得るには、テストを何度も実行する必要があります

例えば。

num_samples = 10000
for count in range(100):
    dup = 0
    for test_number in range(num_samples):
        the_list = make_birthday_list(count)
        if duplicates(the_list):
            dup += 1
    print(count, dup/num_samples)   # / returns a float in Python3
于 2012-11-27T05:58:10.957 に答える
1

testlength のリストを返しませんcount。結果には 1 つの要素しかありません。これをうまく機能させるには、リスト内包表記を利用する必要があります。

[random.randint(1, 365) for x in range(count)]

次に、ステップ 3:

def probability(count,num):
    dup_trues = sum([duplicates(test(count)) for i in range(num)])  #***
    dup_falses = num-dup_trues
    return float(fails)/num

上記の関数のホストの重要な行にはラベルが付けられ#*** ています。これがどのように機能するかの内訳です。

角括弧内のものはリスト内包表記です。

for i in range(num)i=0、i=1、...i=num-1でこれを行うと言います。重複とテストが何をするか知っています。したがって、リストは真と偽 (1 と 0) の束で終わります。

sumリストの要素を追加します。これにより、真の数が得られます

次の行dup_falses = num-dup_truesは、全部で num 個の結果があり、真でないものは偽であることを示しています。

return float(fails)/numこれfloatはpython 3では必要ありません

于 2012-11-27T06:04:57.637 に答える