2013-03-20 4 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()? Для инициализации генератора случайных чисел необходимо вызывать семя. –

+1

Нет, вам не нужно вызывать 'random.seed', текущее системное время используется для инициализации генератора, когда модуль сначала импортируется. – Matthias

+0

Можете ли вы объяснить, что вы хотите в прозе (а не в коде)? –

ответ

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

Спасибо, что, кажется, дает лучший выбор, если бы я хотел, чтобы буквы появлялись не более двух раз, как я мог это достичь? –

+0

Спасибо, я действительно пытался найти способ сделать игру проще или сложнее, основываясь на том, как раздаются руки. Я уверен, что есть лучшие способы, но я только начал программировать, так что это примерно так же технически, как я могу до сих пор, я буду отмечать ваш первый ответ как лучший, поскольку он решил мою оригинальную проблему, снова спасибо за ввод –

1

«буквы, которые он возвращает, не очень случайны, есть много повторяющихся букв» - серьезно?

Если вы хотите получить русские буквы без повторов, использовать что-то вроде этого:

from random import shuffle 
alphabet = ['a', .., 'z'] 
shuffle(alphabet) 
print(alphabet[: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

Re: «в три раза больше гласных, чем согласных». Почему у вас в три раза больше гласных, чем у согласных? В вашей строке есть 15 гласных и 21 согласный. – hughdbrown

 Смежные вопросы

  • Нет связанных вопросов^_^