首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >基于序列号样本的坦克数量估计

基于序列号样本的坦克数量估计
EN

Code Review用户
提问于 2017-12-09 01:38:58
回答 1查看 156关注 0票数 5

我创建的代码应该用来确定我的猜测系统有多好。

情况是有n辆坦克。每个坦克都是唯一编号为1到n的坦克。这些坦克中有7辆被捕获,所以我们只知道它们的序列号(这是通过从1到n的随机数来完成的)。

我应该根据这些序列号预测n。我的方法(我必须编码)是首先在列表中找到最大数字和数字3标准偏差以上的平均列表。然后,我得到了从1到n的随机数,其中n的范围是最大数和三个标准差数。

在此期间,我计算了所生成的七个序号中的每一个的标准差,在计算了所有标准偏差之后,我发现哪一个最接近于原始列表的标准偏差。与标准差最接近的哪一个都将构成我对n的猜测。我根据需要重复这个过程多次(越多次,结果越准确),以生成一个猜测列表。我最后的猜测就是那份名单的中庸。

代码语言:javascript
运行
复制
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))

这段代码可以工作,但花费的时间太长,无法给出我的结果。这一切的重点是计算精度,但不要太长的路。如何使这段代码更高效地运行?

EN

回答 1

Code Review用户

发布于 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倍的加速比。

票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/182401

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档