2013-03-20 45 views
0
def dealHand(n): 
    """ 
    Returns a random hand containing n lowercase letters. 
    At least n/3 the letters in the hand should be VOWELS. 

    Hands are represented as dictionaries. The keys are 
    letters and the values are the number of times the 
    particular letter is repeated in that hand. 

    n: int >= 0 
    returns: dictionary (string -> int) 
    """ 

    hand={} 
    numVowels = n/3 

    for i in range(numVowels): 
     x = VOWELS[random.randrange(0, len(VOWELS))] 
     hand[x] = hand.get(x, 0) + 1 

    for i in range(numVowels, n): 
     x = CONSONANTS[random.randrange(0,len(CONSONANTS))] 
     hand[x] = hand.get(x, 0) + 1 

    return hand 

这个函数是一个文字游戏,我不得不做的一部分,它被列入了一些辅助功能,帮助上手,我的问题是,它的回报是不是很随机的字母,有很多重复的字母,如:a a c c b e e g j j m m m o o r t v y x,我只是想知道是否有可能得到一个更随机的字符集?的文字游戏蟒蛇随机字符

+0

你有没有打电话给random.seed()?必须调用种子才能初始化随机数生成器。 – 2013-03-20 17:13:29

+1

不,您不必调用'random.seed',当模块第一次导入时,使用当前系统时间来初始化发生器。 – Matthias 2013-03-20 17:18:04

+0

你能解释一下你想散文(而不是代码)吗? – 2013-03-20 18:00:26

回答

1

这里是你的算法更紧凑的表示:

from __future__ import division 
from collections import Counter 
import random 
import string 

VOWELS = "aeiou" 
CONSONANTS = "".join(set(string.lowercase) - set(VOWELS)) 

def dealHand(n): 
    numVowels = n // 3 
    lettersets = [VOWELS] * numVowels + [CONSONANTS] * (n - numVowels) 
    return Counter(c 
     for letterset in lettersets 
     for c in random.choice(letterset) 
    ) 

似乎很随意。


后来:“如果我想让信件出现不超过两次,我怎么能做到这一点?

嗯,你可以这样做,但我不建议这样的:

def dealHand2(n): 
    while True: 
     candidate = dealHand(n) 
     if all(v <= 2 for v in candidate.values()): 
      return candidate 

这是一个无限循环,直到找到一组字母,满足您的条件。运行时间:不确定。

+0

谢谢,这似乎是给予更好的选择,如果我想让信件出现不超过两次,我怎么能实现这一点? – 2013-03-20 18:16:10

+0

谢谢,我真的只是想找到一种方法来让游戏变得更容易或更困难,这取决于双手的处理方式。我相信有更好的方法,但我刚刚开始编程,所以这是尽可能技术性的,因为我可以得到迄今为止,我将标记您的第一个答案,因为它解决了我的原始问题,再次感谢输入 – 2013-03-20 18:41:40

1

“它返回的字母不是很随机,有很多重复的字母” - 严重吗?

如果你想获得N个字母不重复,使用这样的:

from random import shuffle 
alphabet = ['a', .., 'z'] 
shuffle(alphabet) 
print(alphabet[:n]) 

如果n> LEN(字母),你会得到重复反正。

0

在这个版本中,你应该有比辅音多三倍的元音,但确切的数字是不能保证的。

import collections 
import random 

VOWELS = 'aeiou' 
CONSONANTS = 'bcdfghjklmnpqrstvwxyz' 

def dealHand(n): 
letters = 3 * VOWELS + CONSONANTS 
collections.Counter(random.sample(letters, n)) 
+0

回复: “比辅音多三倍”。为什么你会比辅音多出三倍的元音?你的字符串中有15个元音和21个辅音。 – hughdbrown 2013-03-20 18:22:43