-2

コインのトスを特定の回数から最大 200 回シミュレートするアプリケーションを作成しようとしています。表の数と裏の数を記録し、表の最大数をユーザーに表示する必要があります。続けて投げた場合、連続して投げた裏の最大数と、表示されているものに加えて、表と裏の割合。

否定的なコメントはお控えください - Python を学び始めたばかりで、私の試みは以下のとおりです!

import random as rn

rolls=int(raw_input("Enter the number of rolls: "))

for rolls in range(rolls): 
    print rn.choice(['H', 'HH', 'HHH', 'T', 'TT', 'TTT']),
4

3 に答える 3

3

random.choice各トスを使用してトスを生成します。

tosses = ''.join(random.choice('HT') for i in range(rolls))

結果の文字列で H と T の出現を単純にカウントして、それぞれ表と裏の数を取得できます。

heads = tosses.count('H')
tails = tosses.count('T')

最後に、文字列を他の記号で分割し、結果の最大部分文字列を見つけることで、行の表/裏の最大数を見つけることができます。

heads_in_a_row = max(len(s) for s in tosses.split('T'))
tails_in_a_row = max(len(s) for s in tosses.split('H'))

信じられないほど効率的ではありませんが、アイデアを得るのに役立つかもしれません。

于 2012-11-18T23:50:54.237 に答える
0

これまでの両方の回答が非常に重いアプローチをとっており、多くのことを非常に非効率的に行っていることに驚きました。特に、メモリの使用に関しては次のようになります。

  • 文字列の作成と処理
  • 入力の冗長コピーの保存
  • カウントのために複数の一時的なリストや文字列を作成する。

さらに、これらのソリューションはどちらも、ランタイムの観点から特にエレガントではなく、実際に何が起こっているか、またはアルゴリズムで実行する必要があるかの手順の側面を説明するのに適していません。これは、初心者の指導の重要な側面です。

次のアプローチでは、コピーを保持する必要がないため、任意の大きな入力 (ロールの量) で作業できます。したがって、ジェネレーター関数または同様のストリーム処理関数に簡単に変換できます。また、より簡単で手続き的にきれいです。

import random

rolls=int(raw_input("Enter the number of rolls: "))

desc = {0: "H", 1: "T"}
total = [0, 0]
running = [0, 0]
running_max = [0, 0]
last_rolled = None

for roll in xrange(rolls):
    # we use 0 for heads and 1 for tails
    # this will be the index to the relevant list element for our counters
    rolled = random.randint(0,1)
    total[rolled] += 1

    if last_rolled == rolled:
        # we are continuing the run, flipped the same as last time
        running[rolled] += 1
    else: 
        # there has been a break in the run
        if not last_rolled is None: 
            # as long as this isnt the first iteration
            print running[last_rolled] * desc[last_rolled], 
            running[last_rolled] = 0
        running[rolled] = 1

    # update the max count
    running_max[rolled] = max(running_max[rolled], running[rolled])
    last_rolled = rolled

print running[last_rolled] * desc[last_rolled]
print "total rolls: H=%d, T=%d" % tuple(total)
print "running max: H=%d, T=%d" % tuple(running_max)

出力例:

Enter the number of rolls: 20
HH TTTT HH TT HHHHHHH T H T
total rolls: H=12, T=8
running max: H=7, T=4
于 2012-11-19T02:34:00.870 に答える