【问题标题】:Using while loop to repeat a function that generates random numbers [closed]使用while循环重复生成随机数的函数[关闭]
【发布时间】:2017-11-10 02:40:53
【问题描述】:

我在使用 while 循环重复函数时遇到问题。

我不是美国学生,所以请理解我的英语。 我不知道出了什么问题,希望我能得到一些帮助。 我知道我可以在函数中附加随机数并返回它。

问题是:

有一个有 5 面的骰子,每面都写着 a , b , c , d ,e。如果我得到一个 d 或一个 e,我会再次投掷并记录下来,直到我得到一个 a、b 或 a c。例如)如果我掷骰子 5 次,我可以得到:d、e、d、d、a 或类似的东西。在我的程序中,我想模拟这个过程。我想要它,以便函数 randomnumbers 可以生成 0~4 的随机数。我希望主程序循环通过此函数获取随机数的过程(强制)。然后,我希望主程序检索这些值并使用它来确定骰子上这些数字的含义(0=a、1=b、2=c、3=d、4=e)并将它们附加到单独的列表。最后我想打印列表中的值,我记录了我得到的值。

我特别要做到以下几点:

  1. 函数应该只返回一个随机数,而不是一个列表
  2. 主程序应负责制作列表并打印从函数中检索到的值。
def randomnumbers():
    r = 0
    import random
    r = random.randrange(0,5)
    return r

abc = ["a", "b", "c", "d", "e"]

List = []
while randomnumbers()>=3:
    List.append(abc[randomnumbers()])

for i in List:
    print i

【问题讨论】:

  • 不要在你的函数中随机导入
  • while randomnumbers()>=3: 应该做什么?
  • 你的函数 randomnumber 确实只返回一个值
  • 据我所知,这段代码是正确的。如果没有产生预期结果,请定义预期结果。
  • 每次调用randomnumbers() 时都会生成一个新的随机数。所以当你用while检查你的随机数时,当你append它到你的列表时,它会是一个完全不同的数字。

标签: python loops random while-loop append


【解决方案1】:

您正在调用您的函数两次。尝试使用:

import random
def randomnumbers():
    r = 0
    r = random.randrange(0,5)
    return r

abc = ["a", "b", "c", "d", "e"]

List = []
while True:
    rand_number = randomnumbers()
    List.append(abc[rand_number])
    if rand_number <3:
        break


for i in List:
    print (i)

【讨论】:

  • 我解决了这个问题。对。
  • 我试过了,但有时程序没有产生任何价值。
  • 正如 Hugh 在您的问题的 cmets 中所写的那样,这种可能性非常高。当第一个随机数低于 3 时就是这种情况。这就是你的 while 循环的逻辑。
  • 您好,您介意再看一下 cmets,我刚刚再次描述了这个问题。对于给您带来的不便,我深表歉意..
  • 现在它可以像您在 cmets 中描述的那样工作了。
【解决方案2】:
import random                        
def randomnumbers():                 
    r = 0                            
    r = random.randrange(0,5)        
    return r                         

abc = ["a", "b", "c", "d", "e"]      

List = []                            
while True:
    nb = randomnumbers()
    if nb >=3:
     List.append(abc[nb])
    elif not List:
        continue
    else:
        break

for i in List:                       
    print i                          

【讨论】:

  • 嗨,我不想让列表超过 3 个字符,但我试图在函数生成大于或等于 3 的数字时停止循环
  • 好的,但是在这种情况下,如果 List 为空,只需添加一个条件以重新运行您的函数
  • 您好,您介意再看一下 cmets,我刚刚再次描述了这个问题。对于给您带来的不便,我深表歉意..
【解决方案3】:

这应该可以解决问题!

from random import shuffle
abc = ["a", "b", "c", "d", "e"]
your_list=[]
your_list.extend(abc)
shuffle(your_list)
print(your_list)

输出:

['e', 'd', 'a', 'c', 'b']

如果你想从旧列表中创建一个新列表,其中元素以随机顺序更改。

也就是说,如果您希望将 abc = ['a','b','c'] 改组为say ['c','a','b'] 以随机方式然后使用 shuffle()

【讨论】:

  • 是什么让你认为 OP 想要洗牌?此外,your_list = abc 毫无意义:它只是将名称your_list 绑定到与abc 相同的列表对象。看看如果你把print(abc) 放在你的代码末尾会发生什么。您是否希望它复制列表?
  • 这是我做过的最愚蠢的事情。愚蠢的粗心错误的人。感谢您指出。这有点尴尬。此外,我不认为 OP 会希望将此作为解决方案,只是想提及一种不同的方式来获得我碰巧知道的解决方案。就这样。如果他愿意,其他答案已经准备好供他选择!
  • 您好,您介意再看一下 cmets,我刚刚再次描述了这个问题。对于给您带来的不便,我深表歉意..
  • @Korean OK 会检查并给出解决方案等待。
  • 在 OP 完全澄清问题之前发布答案可能会很棘手。但是您可以编辑此答案,以便它确实回答实际问题。 :)
【解决方案4】:

正如我在评论中提到的,您确实不需要 randomnumbers 函数来完成此任务。您可以直接拨打random.randrange。但我想这是一个家庭作业,你必须有一个randomnumbers函数,所以我把它简化了。

您还说您希望while 循环在随机数大于或等于 3 时运行,并且您希望列表至少包含一个字母。这意味着您需要测试随机数的值您使用它从abc 中选择一个字母并将该字母添加到列表中。你可以这样做:

import random

def randomnumbers():
    return random.randrange(5)

abc = ["a", "b", "c", "d", "e"]

lst = []
while True:
    r = randomnumbers()
    lst.append(abc[r])
    if r < 3:
        break

for i in lst:
    print(i)

此代码在 Python 2 和 Python 3 上都能正常运行。

我将您的输出列表的名称更改为lst。根据PEP-0008 风格指南,变量名应该全部小写,类名使用大写或驼峰式命名。


FWIW,这里有一种更“Pythonic”的方式来编写该循环:

lst = []
while True:
    lst.append(random.choice("abcde"))
    if lst[-1] < "d":
        break

【讨论】:

  • 您好,您介意再看一下 cmets,我刚刚再次描述了这个问题。对于给您带来的不便,我深表歉意..
  • 谢谢我已经添加了新信息。
  • @Korean 我已经更新了我的答案。
  • 我检查了代码,但在某些情况下,我仍然得到 a、b 或 c 作为答案。我认为弗朗茨正是我需要的。你应该看看他的回答。非常感谢您积极地帮助我。
  • @Korean 当然,您有时会得到 a、b 或 c 作为答案。当这种情况发生时,循环停止。这就是你要求的。 FWIW,我的代码和 Franz 的代码基本相同。
猜你喜欢
  • 2018-06-29
  • 1970-01-01
  • 1970-01-01
  • 2015-12-12
  • 2013-10-22
  • 2020-02-27
  • 2014-02-14
  • 1970-01-01
  • 2015-04-15
相关资源
最近更新 更多