【问题标题】:Unable to add a variable assigned as a random number无法添加分配为随机数的变量
【发布时间】:2018-01-13 05:24:19
【问题描述】:

我已经成功创建了一个随机数生成器,并且之前使用过 random 模块。但我正在尝试为我的天气模拟器项目添加一点随机性。我的问题是,当我添加一个分配为 1 到 99 之间的随机数的变量时,它就是不允许我这样做。

这是代码。有人可以帮我找出正确的方法吗?

import random
from random import*
t = 100
wmph = 51
h = 25
randwmph = random.randint(1, 99)

print ("\nDynamic Weather Simulator | V.004\n")

while True:

if t >= 0 and t <= 150:

    print("\nHumidity:",h)
    print("\nTemperature:",t)
    print("\nWindSpeed:",wmph)
    print("\n________________\n")

if t >= 5 and t <= 100:
    h = h + 0.6

if h >= 50 and t >= 33:
    print("\nRAINFALL\n")

if h >= 50 and t <= 32:
    print("\nSNOWFALL\n")

if h >= 55:
    h = h - 20
if wmph >= 30:
    t = t - 2
if wmph <= 29:
    t = t + 1

if wmph >= 60:
    wmph = wmph - randwmph # UNABLE TO USE THIS VARIABLE AS A NUMBER, EVEN THOUGH IT IS ASSIGNED AS A RANDOM NUMBER BETWEEN 1 and 99

else:
    wmph = wmph + 4

【问题讨论】:

  • “不让我这样做”和“无法将此变量用作数字”是什么意思?您收到错误消息吗?见minimal reproducible example
  • 请给出正确的错误描述并检查代码的缩进和间距!
  • 欢迎来到 StackOverflow。如需将来参考,请参阅How To Ask 以增加获得有意义答案的机会。即在这种情况下 - 预期结果是什么,遇到的错误是什么。对于 Python,请记住缩进很重要(例如,while 块下方的所有代码都应该是循环的一部分吗?如果是,它们应该缩进。如果不是:while 语句不应该是在那里。
  • 删除from random import *这一行或仅使用randint
  • 当您from random import * 时,您使用来自random 模块的函数random.random 覆盖模块random(在上一行中导入)。 random 函数没有 randint 属性。

标签: python python-3.x random


【解决方案1】:
import random
from random import*

当你使用这种风格进行导入时,不需要random.randint()。你应该只使用 randint(1,99)。

否则只替换为import random 其余的应该没问题。

【讨论】:

  • 不一定。 while True: 将抛出错误,除非代码正确缩进。除此之外,是的,删除from random import* 应该可以解决它。
  • 代码可能在 OP 的编辑器中缩进,应该让他怀疑他不知道如何在 SO 上缩进它
  • 实际上,使用from random import *不是是个好主意。这样的通配符导入又名“星”导入将所有导入的名称转储到您的命名空间中,这很混乱并且可能导致名称冲突。它们还使代码更难阅读,因为您需要知道并记住所有不同名称的来源。请看stackoverflow.com/questions/2386714/why-is-import-bad
  • 我实际上并没有阅读其余部分。我只是查看了随机变量的问题,因为这是他想知道的。
  • @iamauser:我倾向于谨慎行事。太多次我看到像这样的粗心错误导致的错误。特别是对于初学者来说,这些事情应该指出来,即使对他们来说可能没问题。只是这样他们就不会再出现第二个错误。
【解决方案2】:

正如所有在 cmets 中提到的那样,您的错误原因是

from random import*

它导入random 模块中定义的所有名称并将它们转储到您的全局命名空间中。其中一个名称是random,它是random 函数,并且这个新名称破坏了之前将该名称分配给模块本身的分配,这是由

import random

所以现在名称 random 指的是 random 函数,而不是 random 模块。所以当你尝试做

random.randint(1, 99)

您将收到以下错误消息:

AttributeError: 'builtin_function_or_method' object has no attribute 'randint'

因为random 函数没有randint 属性。


一般来说,您应该避免此类通配符导入(也称为“星号”导入)。它们将所有导入的名称转储到您的命名空间中,这很混乱,而且正如您所发现的,它们可能导致名称冲突。它们还使代码更难阅读,因为您需要知道并记住所有不同名称的来源。请参阅Why is “import *” bad? 了解有关此重要主题的更多信息。

【讨论】:

  • 是的,我已经解决了。不过还是谢谢!似乎修复后代码运行,但不是随机的。我已经编辑了我上面的原始问题..请阅读并帮助:)
  • @taylorbeeler 请不要在收到相关答案后更改您的问题。您的问题及其答案不仅可以帮助您,还应该对未来的读者有所帮助。但是像这样编辑它会使现有的答案变得无关紧要。如果您有新问题,可以提出新问题。
  • @taylorbeeler 但是您的新问题是因为您没有在while 循环内调用random.randint 函数,因此它只是继续使用在循环外生成的相同原始随机数。
  • 如果我需要添加更多细节,它说要编辑我的问题,所以我做到了。但是我明白。非常感谢您的回答。有什么办法可以帮助我弄清楚如何将它添加到我的循环中?我的印象是……
  • @taylorbeeler 只需将randwmph = random.randint(1, 99) 行移动到while 循环内。你可以把它直接放在while 行下面(适当缩进),但我建议把它放在if wmph &gt;= 60: 行下面,(缩进所以它在if 块内)所以它只有在你需要时才会生成.
【解决方案3】:
Replace "random.randint(1,99)" with just "randint(1,99)"

而且你必须缩进你的 while 循环。另外,我添加了一个时间延迟以更好地可视化..

import random
from random import*
import time
t = 100
wmph = 51
h = 25
randwmph = randint(1,99)

print ("\nDynamic Weather Simulator | V.004\n")

while True:

    if t >= 0 and t <= 150:

        print("\nHumidity:",h)
        print("\nTemperature:",t)
        print("\nWindSpeed:",wmph)
        print("\n________________\n")

    if t >= 5 and t <= 100:
        h = h + 0.6

    if h >= 50 and t >= 33:
        print("\nRAINFALL\n")

    if h >= 50 and t <= 32:
        print("\nSNOWFALL\n")

    if h >= 55:
        h = h - 20
    if wmph >= 30:
        t = t - 2
    if wmph <= 29:
        t = t + 1

    if wmph >= 60:
        wmph = wmph - randwmph # UNABLE TO USE THIS VARIABLE AS A NUMBER, EVEN THOUGH IT IS ASSIGNED AS A RANDOM NUMBER BETWEEN 1 and 99

    else:
        wmph = wmph + 4
    time.sleep(1)

【讨论】:

  • 谢谢大家!我让它工作。它正在删除“从随机导入*”-我什至不知道我是如何养成这样做的习惯的。感谢 time.sleep 行!我不知道!绝对有帮助。
  • 等等,它不起作用。仍然。它似乎每次减去一个特定的数量,而不是一个随机数。总是一样的
  • 在while循环中添加“randwmph = randint(1,99)”行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-23
  • 2014-06-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多