1

私はこの問題を解決するためのコードに取り組んでいます:

あなたとあなたの友達はニューヨークにいて、ブロードウェイのミュージカルを見に行く予定です。残念ながら、ニューヨークはニューヨークなので、チケットはほんの少し高価です。しかし、ショーの 1 つでは、毎晩チケットの宝くじが行われ、あなたのような生意気な人が、少し安いチケットを良い席に購入する権利を勝ち取るチャンスがあります。抽選は次のように行われます。まず、興味のある方は抽選に参加してください。次に、n 人の幸運な当選者が抽選され、それぞれが最大 t 枚のチケットを購入するように提案されます。

あなたのグループの人数 p (全員が宝くじに参加した) と、宝くじに参加した合計人数 m を考えると、グループ全体のチケットを手に入れることができる確率は? 宝くじに応募した m 人の中から一様に無作為に n 人の幸運な当選者が選ばれ、各人が最大 1 回当選するとします。

これが私のコードです:

import math

def lottery():

    m = int(raw_input('The number of people who entered the lottery: '))
    n = int(raw_input('The number of winner drawn from the total: '))
    t = int(raw_input('The number of tickets each winner can purchase: '))
    p = int(raw_input('The number of people in your group: '))

    def combinations(n, k):
        if 0 <= k <= n:
            ntok = 1
            ktok = 1
            for t in xrange(1, min(k, n - k) + 1):
                ntok *= n
                ktok *= t
                n -= 1
            return ntok // ktok
        else:
            return 0

    needed_wins = int(math.ceil(p/t))

    others = m - p

    loss = 0
    for i in range(needed_wins):
        loss += combinations(others, n-i) * combinations(p, i)

    total = combinations(m, n)

    prob = 1 - loss / total

    print(prob)

私はそれを実行しようとしましたが、結果は間違っていました。たとえば、組み合わせが (100,10,2,1) の場合、結果は 0.1 になります。代わりに 1 が返されました。

4

1 に答える 1

5

Python 2 では、2 つの整数を除算すると、常に整数の結果が得られます。この行をファイルの先頭に追加してみてください。これにより、int を分割すると float が生成される新しい Python 3 の動作が得られます。

from __future__ import division
于 2012-12-24T02:35:52.060 に答える