【问题标题】:Python3 randrange giving same resultPython3 randrange 给出相同的结果
【发布时间】:2016-04-28 20:16:56
【问题描述】:

所以我正在制作一个小型文字游戏,我想做的一件事是从一系列变量中获取一个随机数。

出于测试目的,我编写了如下代码:

slow_speed = random.randrange(10,25)
medium_speed = random.randrange(26, 50)
fast_speed = random.randrange(51, 75)

penalty_list = [slow_speed, medium_speed, fast_speed]

for i in range(3):
    for penalty in penalty_list:
        print(penalty)

这个想法是它会在列表中循环 3 次,每次都会为每个范围提供不同的随机数。

但是,我得到相同的 3 个数字循环 3 次。我认为这是因为当我调用该函数时种子(我计算机上的时间)是相同的,所以我尝试添加 time.sleep() 和 random.seed() 但这没有帮助。

那么我该如何解决这个问题? 谢谢!

【问题讨论】:

  • 什么是slow_penaltymedium_penaltyfast_penalty?它们似乎不是随机生成的
  • 谢谢你,我改变了问题。惩罚也是 rand.range 函数,只是我不小心选错了问题。
  • random.randrange() 返回一个整数,而不是每次打印时都会改变值的对象。如果您需要新值,请生成更多整数(每次再次调用random.randrange())。
  • 数字仅在第一次选择时随机。见relevant xkcd

标签: python python-3.x random


【解决方案1】:

您需要将变量声明放在for 循环中。这样,在每次迭代期间都会生成随机数。以下可能是您正在寻找的内容:

import random

for i in range(3):
    slow_speed = random.randrange(10,25)
    medium_speed = random.randrange(26, 50)
    fast_speed = random.randrange(51, 75)
    penalty_list = [slow_speed, medium_speed, fast_speed]

    for penalty in penalty_list:
        print(penalty)

样本输出

13
31
63
17
26
61
16
46
67

【讨论】:

    【解决方案2】:

    将您的速度定义为元组范围,然后对它们调用random.randrange。使用* 解包元组对中的参数。

    slow_speed = (10,25)
    medium_speed = (26, 50)
    fast_speed = (51, 75)
    
    penalty_list = [slow_speed, medium_speed, fast_speed]
    
    for i in range(3):
        for penalty in penalty_list:
            print(random.randrange(*penalty))
    
    # Output:
    17
    43
    59
    11
    38
    61
    24
    35
    54
    

    或者将整个事情作为一个列表理解:

    >>> [[random.randrange(*penalty) for penalty in penalty_list] for _ in range(3)]
    [[21, 27, 73], [10, 47, 72], [10, 35, 55]]
    

    【讨论】:

      【解决方案3】:
      for i in range(3):
          slow_speed = random.randrange(10,25)
          medium_speed = random.randrange(26, 50)
          fast_speed = random.randrange(51, 75)
          penalty_list = [slow_speed, medium_speed, fast_speed]
          for penalty in penalty_list:
              print(penalty)
      

      你不会在每个循环中生成随机数,这就是原因。

      【讨论】:

        【解决方案4】:

        想想使用打字机,然后用猴子敲击键。一旦锤子敲到墨带上并且字母已经印在纸上,这些字母就不会再改变了。您可以在纸上重新阅读产生的乱码,但乱码将保持不变。如果你想要不同的胡言乱语,在打字机里放更多的纸,然后让猴子再次敲击按键。

        random.randrange() 是那只猴子,它会返回一个int 对象;那是纸。在循环中打印这些整数不会改变结果,您需要返回并让random.randrange() 敲击键每次在循环中

        for i in range(3):
            slow_speed = random.randrange(10,25)
            medium_speed = random.randrange(26, 50)
            fast_speed = random.randrange(51, 75)
        
            penalty_list = [slow_speed, medium_speed, fast_speed]
        
            for penalty in penalty_list:
                print(penalty)
        

        【讨论】:

        • 感谢您的精彩解释!
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多