【问题标题】:How to make random.shuffle truly random?如何使 random.shuffle 真正随机?
【发布时间】:2015-10-10 09:25:12
【问题描述】:

所以我有这个清单:

words = ["Games","Development","Keyboard","Speed","Typer","Anything","Alpha","Zealous","Accurate","Basics","Shortcut","Purpose","Window","Counter","Fortress","Modification","Computer","Science","History","Football","Basketball","Solid","Phantom","Battlefield","Advanced","Warfare","Download","Upload","Antidisestablishmentarianism","Supercalifragilisticexpialidocious","Discombobulation","Liberated","Assassin","Brotherhood","Revelation","Unity","Syndicate","Victory"]

我有这个可以随机播放并显示在标签上:

entry.delete(0, tkinter.END)
random.shuffle(words)
label.config(text=str(words[1]))
timeLabel.config(text="Time: " + str(time_score)+ "s")

我想知道如何使这种随机播放真正随机化,因为尽管列表中有很多内容,但感觉就像我一遍又一遍地听到同一个词。 也许有一种方法可以在从列表中取出一个值后从列表中删除它,这样它就不能再次显示了?

【问题讨论】:

  • 从列表中删除每个字词以使其无法再次显示后会发生什么?此外,一个单词连续出现两次意味着它随机的。如果您可以根据条目的当前状态来预测条目的未来状态(例如,“条目现在显示'游戏',所以下次不会出现”),那么随机性就会降低。
  • 并非每个单词都会被删除,因为这段代码只运行了 12 次并且列表中的单词超过了 12 个

标签: python random shuffle


【解决方案1】:

@grael 的一个变体解决方案是洗牌,然后使用list.pop 删除项目。无需多次随机播放您的列表。

In [54]: words = ['foo','bar','baz','quux','bizby','squiggle']

In [55]: random.shuffle(words)

In [56]: while words: print(words.pop())
bizby
bar
foo
baz
squiggle
quux

【讨论】:

    【解决方案2】:

    你可以试试:

    import random
    random_word = random.choice(words)
    

    从您的数组中选择随机单词。然后你可以这样做:

    words.remove(random_word)
    

    从数组中删除这个随机选择的单词以避免再次获取它,如果你想获得下一个随机单词。

    编辑 - 回复评论

    当我在下面运行这段代码时,我每次都会得到不同的词。这是您要寻找的逻辑吗?

    words = ["Games","Development","Keyboard","Speed","Typer","Anything","Alpha","Zealous","Accurate","Basics","Shortcut","Purpose","Window","Counter","Fortress","Modification","Computer","Science","History","Football","Basketball","Solid","Phantom","Battlefield","Advanced","Warfare","Download","Upload","Antidisestablishmentarianism","Supercalifragilisticexpialidocious","Discombobulation","Liberated","Assassin","Brotherhood","Revelation","Unity","Syndicate","Victory"]
    
    import random
    while words:
        random_word = random.choice(words)
        print(random_word)
        words.remove(random_word)
    

    【讨论】:

    • 我这样写:random_word = random.choice(words) 然后random.shuffle(random_word) 然后words.remove(random_word) 并抛出错误说object 'str' does not support item assignment 我把它弄错了吗?
    • 不需要random.shuffle(random_word)
    • 但是在我删除它之后,单词不会随机播放
    • 你需要每次洗牌还是每次都选择不同的随机值?
    • 感谢@grael 和 Kevin 的帮助,现在一切正常!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-28
    • 1970-01-01
    • 2010-11-17
    • 1970-01-01
    • 2016-11-07
    • 1970-01-01
    相关资源
    最近更新 更多