分布不均匀的随机值

时间:2015-09-23 19:20:43

标签: python random

实施Hangman。我想随机选择单词的长度,考虑到单词列表中给定长度的单词数量 - 即。应该选择12个字母的单词,而不是5个字母的单词,因为前者的数量较少。

随机模块看起来不会轻易做到这一点。

我可以一起破解半丑的东西,但我正在寻找一种干净利落的建议。

更新以消除一些混淆:

这是一个作弊版本的刽子手:它在开头指定了一个字长,但实际上并没有选择该字,直到绝对必须。

这里是完整的问题描述(来自“像程序员一样思考”一书的第8章):

  

在一个基于文本的刽子手版本中编写一个玩家1的程序(也就是说,你实际上不必画一个被绞死的人 - 只是跟踪错误猜测的数量)。玩家2将通过指定要猜测的单词的长度以及将丢失游戏的错误猜测的数量来设置游戏的难度。   扭曲的是程序会作弊。不是在游戏开始时实际选择一个单词,程序可以避免选择一个单词,只要玩家2输了,程序就可以显示一个与给予玩家2的所有信息相匹配的单词。正确猜到的字母必须出现在正确的位置,根本没有错误猜到的字母出现在单词中。当游戏结束时,玩家1(程序)将告诉玩家2所选择的单词。因此,玩家2永远无法证明游戏是作弊的;只是玩家2获胜的可能性很小。

2 个答案:

答案 0 :(得分:3)

如果您的单词位于__kindof列表中,words将统一随机从列表中选择一个单词。

如果您只有字长,我会将长度和计数存储在列表中:

random.choice(words)

并使用此答案中的算法统一选择长度:https://stackoverflow.com/a/4322940/71522

答案 1 :(得分:0)

# rel_dist holds the relative weight you want for each word length
# here, words of length 3 have weight 9, length 4 have weight 8, etc
# make sure you cover all word lengths
rel_dist = [0, 0, 0, 9, 8, 7, 6, 5, 4, 3]
random.choice(sum([[word]*rel_dist[len(word)]) for word in words], []))