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 :(得分:1)
“它返回的字母不是很随机,有很多重复的字母” - 认真吗?
如果你想获得没有重复的n个字母,请使用以下内容:
from random import shuffle
alphabet = ['a', .., 'z']
shuffle(alphabet)
print(alphabet[:n])
如果n> len(字母表),无论如何你都会重复。
答案 1 :(得分: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
这是一个无限循环,直到它找到一组满足你条件的字母。运行时间:不确定。
答案 2 :(得分:0)
在这个版本中,元音的元音数应该是辅音的三倍,但确保数字不确定。
import collections
import random
VOWELS = 'aeiou'
CONSONANTS = 'bcdfghjklmnpqrstvwxyz'
def dealHand(n):
letters = 3 * VOWELS + CONSONANTS
collections.Counter(random.sample(letters, n))