Download as pdf or txt
Download as pdf or txt
You are on page 1of 16

Python random Data generation

Exercise
Prepared by Dr. Esmat Mohamed

This Python exercise will help you to practice random data generation techniques. This exercise
question focuses on generating random numbers, choices, and samples using the random module
and secrets module.

This exercise includes:

 10 questions.
 The solution is provided at the end of each question.
 When you complete each question, you will be more familiar with random data generation
techniques in Python.
Refer to the following tutorials to solve the exercise.

 Generating Random data in Python.


 Secure Random data in Python.
Use Online Code Editor to solve each question.

Table of contents
 Exercise 1: Generate 3 random integers between 100 and 999 which is divisible by 5
 Exercise 2: Random Lottery Pick. Generate 100 random lottery tickets and pick two lucky
tickets from it as a winner.
 Exercise 3: Generate 6 digit random secure OTP
 Exercise 4: Pick a random character from a given String
 Exercise 5: Generate random String of length 5
 Exercise 6: Generate a random Password which meets the following conditions
 Exercise 7: Calculate multiplication of two random float numbers
 Exercise 8: Generate random secure token of 64 bytes and random URL
 Exercise 9: Roll dice in such a way that every time you get the same number
 Exercise 10: Generate a random date between given start and end dates

1
Exercise 1: Generate 3 random integers between 100
and 999 which is divisible by 5
Reference article for help: Python get a random number within a range

Show Solution

import random

print("Generating 3 random integer number between 100 and 999 divisible by 5")
for num in range(3):
print(random.randrange(100, 999, 5), end=', ')

Exercise 2: Random Lottery Pick. Generate 100 random


lottery tickets and pick two lucky tickets from it as a
winner.
Note you must adhere to the following conditions:

 The lottery number must be 10 digits long.


 All 100 ticket number must be unique.
Hint: Generate a random list of 1000 numbers using randrange() and then use
the sample() method to pick lucky 2 tickets.

Show Solution

import random

lottery_tickets_list = []
print("creating 100 random lottery tickets")
# to get 100 ticket
for i in range(100):
# ticket number must be 10 digit (1000000000, 9999999999)
lottery_tickets_list.append(random.randrange(1000000000, 9999999999))
# pick 2 luck tickets
winners = random.sample(lottery_tickets_list, 2)
print("Lucky 2 lottery tickets are", winners)

2
Exercise 3: Generate 6 digit random secure OTP
Reference article for help:

 Python secrets module to generate secure numbers


 Python get a random number within a range
Show Solution

import secrets

#Getting systemRandom class instance out of secrets module


secretsGenerator = secrets.SystemRandom()

print("Generating 6 digit random OTP")


otp = secretsGenerator.randrange(100000, 999999)

print("Secure random OTP is ", otp)

Exercise 4: Pick a random character from a given String


Reference article for help: random.choice()

Show Solution

import random

name = 'pynative'
char = random.choice(name)
print("random char is ", char)

Exercise 5: Generate random String of length 5


Note: String must be the combination of the UPPER case and lower case letters only. No
numbers and a special symbol.

Reference article for help: Generate random String in Python.

Show Solution

3
import random
import string

def randomString(stringLength):
"""Generate a random string of 5 charcters"""
letters = string.ascii_letters
return ''.join(random.choice(letters) for i in range(stringLength))

print ("Random String is ", randomString(5) )

Run

Exercise 6: Generate a random Password which meets


the following conditions
 Password length must be 10 characters long.
 It must contain at least 2 upper case letters, 1 digit, and 1 special symbol.
Reference article for help: Generate random String and Password in Python

Show Solution

import random
import string

def randomPassword():
randomSource = string.ascii_letters + string.digits + string.punctuation
password = random.sample(randomSource, 6)
password += random.sample(string.ascii_uppercase, 2)
password += random.choice(string.digits)
password += random.choice(string.punctuation)

passwordList = list(password)
random.SystemRandom().shuffle(passwordList)
password = ''.join(passwordList)
return password

print ("Password is ", randomPassword())

Run

Exercise 7: Calculate multiplication of two random


float numbers
Note:

4
 First random float number must be between 0.1 and 1
 Second random float number must be between 9.5 and 99.5
Reference article for help: Generate a random float number between a float range

Show Solution

Exercise 8: Generate random secure token of 64 bytes


and random URL
Reference article for help: Python secrets module to generate a secure token and URL

Show Solution

import secrets

print("Random secure Hexadecimal token is ", secrets.token_hex(64))


print("Random secure URL is ", secrets.token_urlsafe(64))

Run

Exercise 9: Roll dice in such a way that every time you


get the same number
Dice has 6 numbers (from 1 to 6). Roll dice in such a way that every time you must get the same
output number. do this 5 times.

Reference article for help:

 How to seed random number generator


 random.choice()
Show Solution

import random

dice = [1, 2, 3, 4, 5, 6]
print("Randomly selecting same number of a dice")
for i in range(5):
random.seed(25)
print(random.choice(dice))

Run

5
Exercise 10: Generate a random date between given
start and end dates
Show Solution

import random
import time

def getRandomDate(startDate, endDate ):


print("Printing random date between", startDate, " and ", endDate)
randomGenerator = random.random()
dateFormat = '%m/%d/%Y'

startTime = time.mktime(time.strptime(startDate, dateFormat))


endTime = time.mktime(time.strptime(endDate, dateFormat))

randomTime = startTime + randomGenerator * (endTime - startTime)


randomDate = time.strftime(dateFormat, time.localtime(randomTime))
return randomDate

print ("Random Date = ", getRandomDate("1/1/2016", "12/12/2018"))

Run

Filed Under: Python , Python Exercises , Python Random


Did you find this page helpful? Let others know about it. Sharing helps
me continue to create free Python resources.

TweetF sharein shareP Pin


About Vishal

Founder of PYnative.com I am a Python developer and I love to write


articles to help developers. Follow me on Twitter. All the best for your future
Python endeavors!

Related Tutorial Topics:

Python Python Exercises Python Random


6
Python Exercises and Quizzes

Free coding exercises and quizzes cover Python basics, data structure, data
analytics, and more.

 15+ Topic-specific Exercises and Quizzes


 Each Exercise contains 10 questions
 Each Quiz contains 12-15 MCQ
Exercises

Quizzes

Comments

1. Mohammad says
JULY 5, 2022 AT 9:24 AM

Q7:

You have num1 instead of num2.

import random

num1 = random.random()

print("First Random float is ", num1)

num2 = random.uniform(9.5, 99.5)

print("Second Random float is ", num1) ----> SHOULD BE NUM2

num3 = num1 * num2

print("Multiplication is ", num3)

REPLY
7
2. alcebytes says
JANUARY 3, 2022 AT 10:23 AM

import datetime

import random

def date_generated(d1, d2):

start = datetime.datetime.strptime(d1, '%d-%m-%Y')

end = datetime.datetime.strptime(d2, '%d-%m-%Y')

intervalo = [start + datetime.timedelta(x) for x in range(int ((end-


start).days)+1)]

datas = []

for data in intervalo:

datas.append(data.strftime('%d-%m-%Y'))

print(*random.sample(datas, 1))

date_generated('03-12-2021','03-01-2022')

# saída

03-01-2022

REPLY

3. Bill says
NOVEMBER 27, 2021 AT 9:19 AM

8
This solution would never have a 0 as the first digit. So piecing together strings of
0-9’s is more accurate and chances of a dup are almost 0.

REPLY

4. cub8 says
JULY 17, 2021 AT 4:27 PM

I think your solution of Q10 is unnecessarily too complicated. Here’s my idea of


solving this problem:

import datetime

import random

def getRandomDate(startDate : datetime.date, endDate : datetime.date) ->


datetime.date:

print(f'Generating random date between {startDate} and {endDate}.')

rangeEnd = (endDate - startDate).days

delta = random.randint(0, rangeEnd)

randomDate = startDate + datetime.timedelta(days=delta)

return randomDate

startDate = datetime.date(2016, 1, 1)

endDate = datetime.date(2018, 12, 31)

randomDate = getRandomDate(startDate, endDate)

print(f'The random date is {randomDate}!')

REPLY

9
5. Ali says
JULY 19, 2019 AT 1:05 AM

I think I may have found a simpler solution for Q10 as yours was difficult to
follow:

def random_dates(start_date,end_date):

start_date = start_date.split('-')

end_date = end_date.split('-'))

random_day = random.randint(int(start_date[1]),int(end_date[1]))

random_month = random.randint(int(start_date[0]),int(end_date[0]))

print ('Date = ' + str(random_month) + ' - ' + str(random_day) + ' - ' + '2019')

REPLY

6. Vitaliy says
JUNE 23, 2019 AT 9:59 PM

Q5

print("".join(random.choices(string.ascii_letters, k=5)))

REPLY

7. Bill Hardwick says


MAY 21, 2019 AT 6:23 PM

Q10 – I think your solution is unnecessarily complicated. I offer my simpler


solution:

10
import random, datetime as dt

start_date = dt.date(2019, 1, 1)

print(f'Start of period = {start_date}')

end_date = dt.date(2019, 12, 25)

print(f'End of period = {end_date}')

delta = (end_date - start_date).days

r = random.randint(0, delta)

r_date = start_date + dt.timedelta(days = r)

print(f'Random date = {r_date}')

Start of period = 2019-01-01

End of period = 2019-12-25

Random date = 2019-04-14

REPLY

8. Bill Hardwick says


MAY 18, 2019 AT 6:51 PM

Q6 – Hmm. I hadn’t come across the shuffle function, so rather than code one
myself, I arrived at this alternative solution. It is obviously less efficient than your
answer, but given the scale of the problem the timing difference is not of
practical significance.

import string, secrets

s = string.ascii_letters + string.digits + string.punctuation

pw = ''

uc = 0

11
dg = 0

sp = 0

while len(pw) < 10:

z = secrets.choice(s)

if z in string.ascii_uppercase: uc += 1

elif z in string.digits: dg += 1

elif z in string.punctuation: sp += 1

pw += z

if len(pw) == 10:

#Does it meet the criteria? If not, ditch it and try again

if uc < 2 or dg < 2 or sp < 2:

pw = ''

uc = dg = sp = 0

print(pw)

REPLY

o Rishikesh Shah says


APRIL 19, 2022 AT 11:04 AM

Exercise 6: I have also similar solution like you.

num = 0

upper_let = 0

special_char = 0

while True:

12
random_password = ''.join(random.choice(string.ascii_letters + string.digits +
string.punctuation ) for i in range(10))

for item in random_password:

if item.isupper():

upper_let += 1

if item.isnumeric():

num += 1

if not (item.isalpha() or item.isdigit() or item.isspace()):

special_char += 1

if upper_let >=2 and num >=1 and special_char >= 1:

print("Random password is:", random_password)

break

REPLY

9. Bill Hardwick says


MAY 18, 2019 AT 6:00 PM

Q5 – badly worded. “String must be the combination of the UPPER case and
lower case letters only. No numbers and a special symbol.”
Thus can only be interpreted as requiring a string comprised of letters (any case –
or arguably a mix of cases) plus a special symbol. (A slightly more difficult
problem which I addressed.)
I suggest re-wording it as “The string must contain only upper and/or lower case
alphabetic characters..” There is no need for your second sentence.

REPLY

10. Bill Hardwick says


MAY 18, 2019 AT 4:50 PM

13
Q2 – Sorry, but I’m afraid your solution is incorrect: it does not preclude duplicate
ticket numbers being generated. For example, substituting smaller values into
your solution for demonstration purposes:

import random

lottery_tickets_list = []

print("creating 10 random lottery tickets")

for i in range(10):

lottery_tickets_list.append(random.randrange(10, 20))

print(lottery_tickets_list)

typically results in duplicate-riddled output like this:


creating 10 random lottery tickets
[18, 16, 13, 13, 16, 10, 10, 14, 11, 16]

My solution uses a set rather than a list to achieve the correct result:

import random

tickets = set()

while len(tickets) < 100:

tickets.add(random.randrange(1000000000, 10000000000))

print('Drum roll...')

print('and the lucky winners are numbers:')

winners = random.sample(tickets, 2)

print(f'{winners[0]} and {winners[1]}')

which outputs
Drum roll…
and the lucky winners are numbers:

14
8975225689 and 1386699143
Note also the use of 10000000000 as the top of the range value rather than your
9999999999 because the end-point for the range is exclusive. (The same
comment applies to Q1, although this does not affect the outcome.)

REPLY

o vahlo says
OCTOBER 23, 2020 AT 12:29 PM

Hi, I believe your conclusion about the original solution is correct but your code could
be simplified as well. This code has done the trick for me:

import random

tickets = random.sample(range(1000000000, 9999999999), 100)

winners = random.sample(tickets, 2)

print('Winners are:',winners)

I believe as random.sample generates unique choices it can be used for the tickets as
well.

REPLY

 Igor says
JULY 25, 2022 AT 4:45 PM

Yep, the answer to Q2 is incorrect.


Your solution is slick and concise.
Bill’s idea with the set() was smart, too (although sampling from a set is now deprecated).
I’ve solved it in the following way (which is a bit verbose):

tickets = []

15
tickets_amount = 100

counter = 0

while True:

ticket = random.randrange(int(1e9), int(1e10))

if ticket not in tickets:

tickets.append(ticket)

counter += 1

if counter == tickets_amount:

break

REPLY

16

You might also like