How about (NOT SECURE YET, IT NEEDS MORE ENTROPY):<p><pre><code> from nltk.corpus import wordnet as wn
all_animals = set()
def add_to_set(animal):
all_animals.add(animal.name.split('.')[0].replace('_',' '))
for child in animal.hyponyms():
add_to_set(child)
add_to_set(wn.synset('animal.n.01'))
all_animals = list(all_animals)
actions = ['ate','chased','killed','fought','kissed',
'talked to','hated','loved','ambushed','fled'] # can add more
def make_password():
import random
random = random.SystemRandom() # is this secure?
choice = random.choice
return 'the %s %s the %s'%(choice(all_animals), choice(actions), choice(all_animals))
</code></pre>
If you pruned out 90% of the animals (i.e. the obscure, hard to spell, or scientific names), this is still about 20 bits. And the passwords are kind of memorable (I've gotten such gems as "the dodo chased the guppy" or "the tigress killed the king charles spanial").<p>You could also add a humorous adjective ("rabid", "talking", "magic", "invisible", "evil" ...) or adverb ("roughly", "quickly", "quietly", "secretly" ...).<p>You could also add a place name.