Python的百分之

时间:2016-04-18 18:50:52

标签: python

我想让一个程序正常运行。我几乎拥有它,但有些事情仍会导致错误。

主要思想是程序会做这些事情:

  • 向用户询问击中(1 - 100 int)
  • 的罚球数
  • 在1000次投掷时进行刺激,并且在每次投掷时计算它是否命中或未命中。
  • 每次投掷必须有一条线:命中或未命中。'
  • 总结所有击中并最终打印的投掷。

示例:

Insert %  of free throws: 45
1. throw hits
2. throw hits
3. throw misses
4. throw hits
...
997. throw misses
998. throw misses
999. throw hits
1000. throw misses
Hits 458 throws.

我创造了这个:

from random import randint
percent = int(input("Insert % of free throws: "))
var = 1
hits = 0
while var < 1000:
if randint(1, 100) <= percent:
    var = var + 1
    print(str(var) + '. throw hits')
    hits = hits + var 
else:
    print(str(var) + '. throw misses')

print("Hits " + str(hits) + " throws.")

但是有一些错误。首先,如果我插入0%然后它会变得疯狂,第二个是,命中计数是荒谬的 - 比如500500等等。我知道 var!= 0 ,但它仍然无法正常工作,对我来说,计算事物仍然是个谜。我曾尝试过,但是已经试过了。在var之前和之后它仍然没有工作。 任何人都有想法让我走上正轨吗?

2 个答案:

答案 0 :(得分:1)

问题是,当你受到攻击时,你只会递增var,你应该为每次投掷增加它。所以只需使用一个简单的for循环。

每次点击时,您应该将hits增加1,而不是var

for var in range(1, 1001):
    if randint(1, 100) <= percent:
        hits += 1
        print(str(var) + '. throw hits')
    else:
        print(str(var) + '. throw misses')
print ("Hits " + str(hits) " throws.")

请注意,range()不包含范围内的结束编号,因此要从var = 1开始获得1,000次抛出,您必须使用1001作为结束。

答案 1 :(得分:1)

巴马尔了解了结果值出现奇怪的原因,所以让我挑选一些要点进行审核,因为这是一个说明性的代码示例。

&#34;标准&#34;在Python中进行加权分配的方法是:

random.random() < pct

当pct是1的分数时,例如45% - > 1。 0.45。这会将您的代码更改为:

percent = int(input("Insert % of free throws: ")) / 100

...
    if random.random() < percent:
        ...

其他挑剔包括尽可能避免while循环。您在Python中需要while循环并不是while True,这种情况很少见。使用for循环,尤其是因为您正在尝试跟踪循环索引!将其与其他一些调整相结合,你得到......

hitcount = 0

for i in range(1, 1001):  # loop from 1 -> 1000 inclusive
    if random.random() < percent:
        hitcount += 1
        msg = "{}. throw hits".format(i)
    else:
        msg = "{}. throw misses".format(i)
    print(msg)
print("Hit {} throws.".format(hitcount))

值得注意的是,这使用str.format而不是使用%运算符构建字符串。这是首选。