Random name generator
This is a problem set. Some of these are easy, others are far more difficult. The purpose of these problems sets are:
- to build your skill applying computational thinking to a problem
- to assess your knowledge and skills of different programming practices
What is this problem set trying to do[edit]
Apply your understanding of computational thinking and programming to a real-world problem.
The Problem[edit]
We have a need to randomly create some realistic-looking names. We need to be able to create N number of names, where N is an integer from 0 to 50000. The names need to be first name, last name.
First names should be between 3 and 7 letters, last names should be between 5 an 15 letters. Names can be built from any real-world cultural context. No klingon names.
Realistic names are generally pronounceable. Realistic names are often common. Your solution must create random names, you may not randomly select a pre-existing name from a list of common names.
I would think about stems of words. For example, many first names might begin with "Ja" followed by something like a "n", "cob", "na", "sper" or a "ke". There are many such common stems in first names and last names.
How you will be assessed[edit]
Your solution will be graded using the following axis:
Scope
- To what extent does your code implement the features required by our specification?
- To what extent is there evidence of effort?
Correctness
- To what extent did your code meet specifications?
- To what extent did your code meet unit tests?
- To what extent is your code free of bugs?
Design
- To what extent is your code written well (i.e. clearly, efficiently, elegantly, and/or logically)?
- To what extent is your code eliminating repetition?
- To what extent is your code using functions appropriately?
Style
- To what extent is your code readable?
- To what extent is your code commented?
- To what extent are your variables well named?
- To what extent do you adhere to style guide?
References[edit]
A possible solution[edit]
Click the expand link to see one possible solution, but NOT before you have tried and failed!
#Random name generator
import random
first_syllable = ["No","Jo","Lu","Li","Rob","Ja","Oli","Da","Ca","Be","Al","Ma","Em","Je","Su","Do","Ha","Ta","Ty","Po","Ha","Fi","Me"]
second_syllable = ["a","e","cy","o","ver","ar","n","ven","na","as","ren","us"]
vowel = ["a","e","i","o","u"]
consonant = ["b","c","d","f","g","h","j","k","l","m","n","p","q","s","t","u","w","x","y","z"]
for i in range(1,50):
exact_name = ""
exact_name+=((first_syllable[random.randrange(0,len(first_syllable)-1)]))
exact_name += ((second_syllable[random.randrange(0,len(second_syllable)-1)]))
exact_name += " "
exact_name+= consonant[random.randrange(0,len(consonant)-1)].upper()
for i in range(random.randrange(2,4)):
exact_name += ((vowel[random.randrange(0,len(vowel)-1)]))
exact_name+=((consonant[random.randrange(0,len(consonant)-1)]))
print(exact_name)
# ============== a different solution ===============
def wordcreator1():
first = random.randint(3,7)
current_word = ''
if first %2== 0:
for i in range(0,int(first/2)):
pair = random.choice(vowel) + random.choice(constanents)
current_word = current_word + pair
else:
first = (first +1)/2
for i in range(0,int(first)):
pair = random.choice(vowel) + random.choice(constanents)
current_word = current_word + pair
if len(current_word) < 3:
current_word = current_word + random.choice(vowel)
elif len(current_word) > 7:
length = int(len(current_word))
current_word = current_word[:length-1]
return current_word
def wordcreator2():
last = random.randint(5,15)
current_word = ''
if last %2== 0:
for i in range(0,int(last/2)):
pair = random.choice(vowel) + random.choice(constanents)
current_word = current_word + pair
else:
last = (last +1)/2
for i in range(0,int(last)):
pair = random.choice(vowel) + random.choice(constanents)
current_word = current_word + pair
if len(current_word) < 3:
current_word = current_word + random.choice(vowel)
elif len(current_word) > 7:
length = int(len(current_word))
current_word = current_word[:length-1]
return current_word