科学计算——概率统计计算机模拟——Python

背景:类似于掷硬币的实验,这里设计了一个类似的实验,加入有10道选择题,可以选择A,B,C,D4个选项,每次实验计算1万组随机答案,做100次实验。
程序如下:
  1. #-*-encoding:utf-8-*-
  2. import random
  3. class examModel(object):
  4.     """
  5.     examModel
  6.     用来进行一个随机检验,背景为:假设有一次考试,共有10道考题,每道考题的可选答案为1,2,3,4,
  7.     检验采用随机方法选择答案的成功率的分布。
  8.     具体的,首先随机获得标准答案,即获得一个1×10的数组作为标准答案
  9.     获得1个10000×10的数组,作为随机测试的结果
  10.     进行频率分布,计算正确率    
  11.     """
  12.     
  13.     def __init__(self, outputFileName='out.txt'):
  14.         self.rightAnswer = self._getAnswer()
  15.         self.checkAnswers = [ self._getAnswer() for i in range(10000) ]
  16.         self.outputFileName = outputFileName
  17.         
  18.     def _getAnswer(self):
  19.         """
  20.         获得答案
  21.         返回一个1*10的数组
  22.         """
  23.         random.seed()
  24.         answer = [ random.choice(['A','B','C','D']) for i in range(10) ]
  25.         return(answer)
  26.     
  27.     def checkAnswer(self):
  28.         """
  29.         对所有的随机测试结果,根据正确率进行频率分布
  30.         并将结果与对应的分析放入一个单独的文件中
  31.         """
  32.         #mnpp表示结果的正确率,分别为0,10,20,30,40,50,60,70,80,90,100分的个数
  33.         mnpp = [ 0 ]*11
  34.         
  35.         #频率分析
  36.         for answer in self.checkAnswers:
  37.             score = self._getScore(answer)
  38.             index = int(score/10)
  39.             mnpp[index] += 1
  40.         
  41.         #结果输出
  42.         f = open(self.outputFileName,'w')
  43.         
  44.         f.write('频率结果:')
  45.         f.write(str(mnpp))
  46.         f.write('/n')
  47.         
  48.         f.write('正确答案:')
  49.         f.write(str(self.rightAnswer))
  50.         f.write('/n')
  51.         
  52.         f.write('随机答案:')
  53.         f.write(str(self.checkAnswers))
  54.         f.write('/n')
  55.         
  56.         f.close()
  57.         
  58.         print(self.outputFileName)
  59.         
  60.         return(mnpp)
  61.         
  62.     def _getScore(self,answer):
  63.         """
  64.         获得分数
  65.         """
  66.         score = 0
  67.         for i in range(len(answer)):
  68.             if ord(answer[i]) == ord(self.rightAnswer[i]):
  69.                 score += 10
  70.         return(score)
  71.         
  72. if __name__ == '__main__':
  73.     mnpps = []
  74.     for i in range(100):
  75.         model = examModel('exam' + str(i) + '.txt')
  76.         mnpp = model.checkAnswer()
  77.         mnpps.append(mnpp)
  78.     
  79.     #总的频率分布计算
  80.     mnpp = [0]*11
  81.     for mnpp_i in mnpps:
  82.         for j in range(len(mnpp_i)):
  83.             mnpp[j] += mnpp_i[j] 
  84.     
  85.     r_mnpp = [ i/sum(mnpp) for i in mnpp ]    
  86.     #输出总的频率分布
  87.     f = open('exam_model.txt','w')
  88.     
  89.     f.write('频数分布:')
  90.     f.write(str(mnpp))
  91.     f.write('/n')
  92.     
  93.     f.write('频率分布:')
  94.     f.write(str(r_mnpp))
  95.     f.write('/n')
  96.     
  97.     f.write('每次随机检验的频率分布:')
  98.     f.write(str(mnpps))
  99.     f.write('/n')  
  100.     
  101.     f.close()
结论:
频率分布为[0.0563,0.1877,0.2816,0.2505,0.1458,0.0582,0.0163,0.0032,0.0004,0.0000,0.0000]
频数分布为[56329, 187739, 281565, 250468, 145779, 58243, 16289, 3177, 375, 35, 1]

意义是采用完全随机的方法,得90分、100分是几乎不可能的,即使及格的机会也仅仅为2%,太难了。
所以如果没有其他因素,比如对某些选项进行排除之类的,考试的时候千万不要采用这种方法。
另外,采用完全随机的方法很容易看出来,得30、40分的可能性最大,即你大概有30%,40%的几率“蒙”对,如果实在没办法,嘿嘿,不妨试试。

另外,学过数论的都知道,根据二项分布很容易找出结果,得0分-100分的概率分别为:
[0.056,0.188,0.282,0.250,0.146,0.058,0.016,0.003,0.000,0.000,0.000]

模拟实验的结果很好。

你可能感兴趣的:(python)