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,我是只是想知道是否有可能获得一组更随机的字符?

4

3 回答 3

1

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

如果您想获得 n 个字母而不重复,请使用以下内容:

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

如果 n > len(alphabet),无论如何你都会得到重复。

于 2013-03-20T17:11:51.317 回答
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

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

于 2013-03-20T17:32:48.960 回答
0

在这个版本中,从统计上讲,元音的数量应该是辅音的三倍,但不能保证确切的数量。

import collections
import random

VOWELS = 'aeiou'
CONSONANTS = 'bcdfghjklmnpqrstvwxyz'

def dealHand(n):
 letters = 3 * VOWELS + CONSONANTS 
 collections.Counter(random.sample(letters, n))
于 2013-03-20T18:16:56.363 回答