-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 回答
0

每当您需要查找连续的事物时,最好考虑itertools.groupby. 无论卷数如何,这种方法都需要很少的额外内存

from itertools import groupby
import random

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

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

maxes = {'H': 0, 'T': 0}
sums = {'H': 0, 'T': 0}

for g, v in groupby(tosses):
    n = sum(1 for x in v)
    maxes[g] = max(maxes[g], n)
    sums[g] += n

print maxes['H']
print maxes['T']
print sums['H']*100.0/rolls
print sums['T']*100.0/rolls
于 2012-11-19T01:25:08.280 回答