【问题标题】:Python generating random numbersPython生成随机数
【发布时间】:2013-12-10 18:26:46
【问题描述】:

这是我的代码:

import random
minimum=int(input("Enter minimal value: "))
maximum=int(input("Enter maximum value: "))
howMany = int(input("How many numbers do you want to generate?"))
sum=0
n=1
while n<=howMany:
    num=random.randrange(minimum,maximum)
    num+=sum
    num+=1
    print(num)
print("Python's random average between", minimum, "and", maximum, "is", sum/howMany*100)

问题在于,当用户输入他们想要生成的数字数量时,它什么也没说,python 也不做任何事情。它只是冻结。我的代码有什么问题?另外,我将如何计算平均值?我得到 0.0 作为平均值。

【问题讨论】:

  • num+=1 应该是n+=1
  • 使用for _ in range(howMany):方便多了,那就别忘了递增

标签: python python-3.x random


【解决方案1】:

我可以推荐使用for .. in 循环来避免这些类型的逻辑错误吗?

import random
minimum=int(input("Enter minimal value: "))
maximum=int(input("Enter maximum value: "))
howMany = int(input("How many numbers do you want to generate?"))
total=0
for n in range(howMany):
    num=random.randrange(minimum,maximum)
    total+=num
    print(num)
print("Python's random average between", minimum, "and", maximum, "is", total/howMany*100)

确实,当我不得不在其他语言中使用常规的 for 循环时,这让我抓狂。

还要注意它应该是sum+=num,而不是num+=sum。 a += b 与 a = a + b 相同 - 修改的是左侧。

【讨论】:

  • total 怎么样 - 所以内置的 sum 不会因为以后出现意外而受到影响......
  • 如果 OP 使用 3,则没有 xrange。
【解决方案2】:

增加n 而不是num 和sum 应该增加num 的值

while n<=howMany:
    num=random.randrange(minimum,maximum)
    sum += num 
    n += 1
    print(num)

还要找到平均使用sum/howMany而不是sum/howMany*100

【讨论】:

    【解决方案3】:

    我建议在生成器表达式上使用内置的sum 函数,而不是手动添加随机值。这比您使用的要高级一些,但它是 Python 真正擅长的事情之一:

    import random
    
    minimum=int(input("Enter minimal value: "))
    maximum=int(input("Enter maximum value: "))
    howMany = int(input("How many numbers do you want to generate?"))
    
    total = sum(random.randint(minimum, maximum) for _ in range(howMany)) # do the sum
    
    avg = total / howMany # compute the average
    
    # print the output
    print("Average of {} random numbers between {} and {} is {:.2}".format(howMany, minimum,
                                                                           maximum, avg))
    

    我也在做一些不同的事情。首先,我使用名称total 作为随机数的总和,以免影响内置的sum 函数。允许使用现有名称,但通常是一个坏主意(它可能导致错误)。由于我使用的是sum 函数,所以将sum 也用作变量名会很混乱。

    在sum 调用内的生成器表达式中,我也使用randint 而不是randrange,因为它包含最大值(randrange 不包括最大值,就像range 一样)。我认为这更符合“在minimum 和maximum 之间”的描述,这表明(至少对我而言)端点应该对称处理。如果您将随机数用于其他目的,则应注意您调用的函数与您的用途相匹配,否则您可能很难找到错误。

    我还使用字符串格式来生成输出,而不是将多个值传递给print。如果需要,这可以在格式化方面提供更大的灵活性。我使用这种灵活性将平均值限制为小数点后两位,而不是 Python 的默认值(通常是浮点数中可用的所有精度,大约小数点后 16 位)。

    【讨论】:

      【解决方案4】:

      如果速度是一个问题。你可以这样做:

      import numpy as np
      total = np.random.random_integers(minimum, maximum, size=(howMany)).sum()
      

      比

      快大约 100 倍
      total = sum(random.randint(minimum, maximum) for _ in range(howMany))
      

      【讨论】:

        【解决方案5】:

        这里n 和howMany 都没有在循环内更新,因此条件始终保持为真 给出一个无限循环。

        更新n 或减少howMany 值。

        【讨论】:

          猜你喜欢
          • 2021-08-14
          • 2013-11-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-07-30
          • 1970-01-01
          • 2023-01-03
          相关资源
          最近更新 更多