我创建的代码应该用来确定我的猜测系统有多好。
情况是有n辆坦克。每个坦克都是唯一编号为1到n的坦克。这些坦克中有7辆被捕获,所以我们只知道它们的序列号(这是通过从1到n的随机数来完成的)。
我应该根据这些序列号预测n。我的方法(我必须编码)是首先在列表中找到最大数字和数字3标准偏差以上的平均列表。然后,我得到了从1到n的随机数,其中n的范围是最大数和三个标准差数。
在此期间,我计算了所生成的七个序号中的每一个的标准差,在计算了所有标准偏差之后,我发现哪一个最接近于原始列表的标准偏差。与标准差最接近的哪一个都将构成我对n的猜测。我根据需要重复这个过程多次(越多次,结果越准确),以生成一个猜测列表。我最后的猜测就是那份名单的中庸。
import random
import statistics
chosenNum = 429 #n is given only to check how well our process works
numRuns = 100 #number of guesses - my teacher wants at least 100
numCorrect = 0
numGuessN = []
guesses = []
percentErrors = []
for x in range(numRuns):
randNum = [random.randint(1,chosenNum + 1),random.randint(1,chosenNum + 1),random.randint(1,chosenNum + 1),random.randint(1,chosenNum + 1),random.randint(1,chosenNum + 1),random.randint(1,chosenNum + 1),random.randint(1,chosenNum + 1)] #generates the seven serial numbers.
NumSTD = statistics.stdev(randNum) #standard deviation
maxNumSTD = statistics.mean(randNum)+(3*(statistics.stdev(randNum))) #three standard deviations above the mean
maxNum = max(randNum) #max number in list
#print (NumSTD)
#print (maxNumSTD)
#print (maxNum)
#print (randNum)
for x in range(200): #the greater the range, the more accurate the results
STDarray = []
if (maxNum - maxNumSTD < 0):
for y in range(maxNum,int(maxNumSTD)): #n is max number to max number from Standard Deviation
randNumZwei = [random.randint(1,y),random.randint(1,y),random.randint(1,y),random.randint(1,y),random.randint(1,y),random.randint(1,y),random.randint(1,y)] #my simulated serial numbers
testNumSTD = statistics.stdev(randNumZwei)
STDarray.append(testNumSTD)
else:
for y in range(int(maxNumSTD),maxNum):
randNumZwei = [random.randint(1,y),random.randint(1,y),random.randint(1,y),random.randint(1,y),random.randint(1,y),random.randint(1,y),random.randint(1,y)]
testNumSTD = statistics.stdev(randNumZwei)
STDarray.append(testNumSTD)
for z in range((len(STDarray) - 1)):
if((min(STDarray, key=lambda x:abs(x-NumSTD))) == STDarray[z]): #find closest number to original standard deviation
numGuessed = z + maxNum
numGuessN.append(numGuessed) #make a list of all the guessed numbers
guess = int(statistics.mean(numGuessN)) #the final guess is simply mean of all the other guesses generated
#print(guess)
guesses.append(guess) #number of final guesses should be the same as number of trials
print ("Your guesses are: " + str(guesses))
for x in range(len(guesses) - 1):
percentError = (abs(guesses[x] - (chosenNum))/float(chosenNum)) * 100
percentErrors.append(percentError)
if(guesses[x] == chosenNum):
numCorrect = numCorrect + 1
else:
closestNumber = min(guesses, key=lambda x:abs(x-chosenNum))
averagePercentError = statistics.mean(percentErrors)
print ("The average Percent Error is: " + str(averagePercentError) + "%")
if (numCorrect > 0):
print ("You got the correct number " + str(numCorrect/float(len(guesses))))
else:
print ("Your closest number was: " + str(closestNumber))
这段代码可以工作,但花费的时间太长,无法给出我的结果。这一切的重点是计算精度,但不要太长的路。如何使这段代码更高效地运行?
发布于 2017-12-10 20:13:29
这段代码最明显的问题是,您使用的是一个非常奇怪的列表和numpy代码组合。Numpy是快速的,因为它允许将事情向量化。例如,您应该只使用[np.random.randint(1,chosenNum + 1) for _ in range(numCapturedTanks)]
而不是np.random.randint(1, chosenNum + 1, size=numCapturedTanks)
。这将生成一个ndArray,并意味着您没有不必要地循环。在createListOfStandardDeviations
中进行同样的更改会产生2倍的加速比。
https://codereview.stackexchange.com/questions/182401
复制相似问题