Python Assignment Help

Python Task on War and Peace by Leo Tolstoy

#!/bin/python3

“””
Explain how your pseudo random numbers are produced.
– The pseudo random numbers without seed value. Will be take the nanosecond on posis system. Then move to text file base on position. So it will work.
– The pseudo rando number with seed value. Will be move to file with this position. That’s mean the random will be the same
“””

import time
 from statistics import mean

class WarAndPeacePseudoRandomNumberGenerator:
 def __init__(self, seed=None):
 """ Constructor """
 self.seed = seed
 self.filename = 'war-and-peace.txt'
 #self.file = open(self.filename, 'rb')
 self.file = None
 self.currentTime = self.getCurrentTimeNanosecond()
 #self.currentPosition = 0

def getCurrentTimeNanosecond(self):
 return int(round(time.time() * (10 ** 9)))
 #return time.time_ns()

def getRandomValue(self):
 """ Get randome value from 0 to 999999 base on seed value. If seed value, get randome base on time-stamp"""
 tmp = None
 if self.seed is None:
 timeStr = str(self.getCurrentTimeNanosecond())
 tmp = int(timeStr[-5:])
 else:
 #tmp = self.seed + (self.getCurrentTimeNanosecond() - self.currentTime)
 tmp = self.seed
 return (1 * tmp + 3123) % 999999

def getCharacterAt(self, indexVal):
 """ Get character of file at indexVal """
 binarystr = " "
 result = None
 self.file = open(self.filename, 'rb')
 while binarystr.isspace():
 self.file.seek(indexVal)
 #self.currentPosition += int(indexVal)
 binarystr = self.file.read(1)
 indexVal += 1
 try:
 result = binarystr.decode("ascii")
 except UnicodeError:
 binarystr = " "
 self.file.close()
 return result

def convertBinaryStrToNum(self, binaryStr):
 """ Convert binary string to number """
 result = 0.0
 divisor = 2
 for i in range(len(binaryStr)):
 result += int(binaryStr[i]) * (1 / (divisor))
 divisor = divisor * 2
 return result

def random(self):
 """ Get random number using the war-and-peace.txt"""
 randomNum = self.getRandomValue()
 binaryStr = ""
 while len(binaryStr) < 16:
 start = self.getCharacterAt(randomNum)
 end = self.getCharacterAt(randomNum + self.getRandomValue())
 bit = None
 #print("DEBUG: start: {} - end: {}".format(start, end))
 if start > end:
 bit = "1"
 if start < end:
 bit = "0"
 if bit is None:
 randomNum = randomNum + self.getRandomValue()
 continue
 randomNum += self.getRandomValue()
 binaryStr += bit
 #print("Test binstr: {}".format(binaryStr))
 return self.convertBinaryStrToNum(binaryStr)

def closeFile(self):
 self.file.close()

if __name__ == "__main__":
 print("With default constructor: WarAndPeacePseudoRandomNumberGenerator()")
 prng = WarAndPeacePseudoRandomNumberGenerator()
 list1 = []
 for i in range(10000):
 #for i in range(10):
 list1.append(prng.random())
 #prng.closeFile()
 print("median: {} ".format(mean(list1)))
 print("minimum: {} ".format(min(list1)))
 print("maximum: {} ".format(max(list1)))
 print("")
 print("With seed 12345 constructor: WarAndPeacePseudoRandomNumberGenerator(12345)")
 prng2 = WarAndPeacePseudoRandomNumberGenerator(12345)
 a = prng2.random()
 b = prng2.random()
 # #prng2.closeFile()
 print("WarAndPeacePseudoRandomNumberGenerator(12345) - random: {} {}".format(a, b))

# prng3 = WarAndPeacePseudoRandomNumberGenerator(1234567)
 # a = prng3.random()
 # b = prng3.random()
 # #prng3.closeFile()
 # print("WarAndPeacePseudoRandomNumberGenerator(1234567) - random: {} {}".format(a, b))
 list2 = []
 for i in range(10000):
 list2.append(prng2.random())
 print("median: {} ".format(mean(list2)))
 print("minimum: {} ".format(min(list2)))
 print("maximum: {} ".format(max(list2)))