Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
123
返回列表 发新帖
楼主: lbport

[已解决]A列是一组0.47~0.63的随机数据,B列是1和0的随机值,1带便正确,0代表错误,如何算...

[复制链接]
发表于 2017-3-31 08:28 | 显示全部楼层
excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
回复

使用道具 举报

发表于 2017-3-31 20:56 | 显示全部楼层
  1. Sub test()
  2.     Dim ar, i&, j&, k&, m&, n&, r#, s$, t&, tms#
  3.     tms = Timer
  4.    
  5.     m = 10000
  6.     ar = [a1].Resize(m, 2)
  7.    
  8.     For n = m * 3 / 10 To m * 35 / 100
  9.         t = 0
  10.         For i = 1 To n
  11.             t = t + ar(i, 2)
  12.         Next
  13.         If t / n > r Then r = t / n: s = " : i = " & i & " : n = " & n & " : r = " & Format(r, "0.0%")
  14.         For i = 2 To m - n + 1
  15.             t = t - ar(i - 1, 2) + ar(i, 2)
  16.             If t / n > r Then r = t / n: s = " : i = " & i & " : n = " & n & " : r = " & Format(r, "0.0%")
  17.         Next
  18.     Next
  19.     MsgBox Format(Timer - tms, "0.00s ") & s
  20. End Sub
复制代码
回复

使用道具 举报

 楼主| 发表于 2017-4-1 10:26 | 显示全部楼层

感谢你的回答!能稍微解释一下这个代码是什么意思吗?我按你的代码运行了一下  返回结果 i=3167  n=3168  r=50.2%
意思是从B3167开始往下3168个数的平均值为最大,并且等于50.2%吗?
我算了一下从B3167:B6334的平均值  是0.504894222  好像跟你的结果不一样啊。
回复

使用道具 举报

发表于 2017-4-1 13:43 | 显示全部楼层
本帖最后由 香川群子 于 2017-4-1 13:51 编辑
lbport 发表于 2017-4-1 10:26
感谢你的回答!能稍微解释一下这个代码是什么意思吗?我按你的代码运行了一下  返回结果 i=3167  n=3168   ...

哦。不符合?那你上附件我确认一下。

回复

使用道具 举报

 楼主| 发表于 2017-4-1 14:14 | 显示全部楼层
香川群子 发表于 2017-4-1 13:43
哦。不符合?那你上附件我确认一下。

好的

根据B选择A.rar

204.73 KB, 下载次数: 2

根据B选择A附件

回复

使用道具 举报

 楼主| 发表于 2017-4-1 14:31 | 显示全部楼层
香川群子 发表于 2017-4-1 13:43
哦。不符合?那你上附件我确认一下。

你好 刚刚发的那个是我的另一份文件  之前我说的那个,也发给你
还有 如果数据不止10000,比如说有十万行,,我取N 的范围是30000~40000这样,代码应该怎么修改呢?

第一份.rar

205.93 KB, 下载次数: 2

第一份

回复

使用道具 举报

发表于 2017-4-1 20:29 | 显示全部楼层    本楼为最佳答案   
代码确实有bug,计算结果是错的。

更正如下:
  1. Sub test()
  2.     Dim ar, i&, i1&, m&, m1&, m2&, n&, n1&, r#, s$, t&, t1&, tms#
  3.     tms = Timer
  4.    
  5.     m = 10000 '设置数据总行数
  6.     ar = [a1].Resize(m, 2)
  7.    
  8.     m1 = m / 10 * 3 '取值个数下限
  9.     m2 = m / 10 * 4 '取值个数上限
  10.    
  11.     For n = m1 To m2 '在取值范围内设置取值个数n
  12.         t = 0
  13.         For i = 1 To n '遍历1-n得到起始n个数据的概率统计值
  14.             t = t + ar(i, 2)
  15.         Next
  16.         t1 = t: If t / n > r Then r = t / n: i1 = 1: n1 = n

  17.         For i = 1 To m - n '继续按取值n个进行位移遍历
  18.             t = t - ar(i, 2) + ar(i + n, 2) '位移时去掉第一个、加上最后1个,变成新的概率统计值
  19.             If t > t1 Then t1 = t: If t / n > r Then r = t / n: i1 = i + 1: n1 = n
  20.         Next
  21.         DoEvents
  22.         Application.StatusBar = Format(Timer - tms, "0.0s ") & Format((n - m1 + 1) / (m2 - m1 + 1), "0.0%")
  23.     Next
  24.     s = "i = " & i1 & " : n = " & n1 & " : r = " & Format(r, "0.00%")
  25.     [d1] = s: [d2] = i1: [d3] = n1
  26.     [d4] = "=SUM(B" & i1 & ":B" & i1 + n1 - 1 & ")": [d5] = "=D3/D2"
  27.     MsgBox Format(Timer - tms, "0.00s") & vbCr & s
  28. End Sub
复制代码


注意:如果设置m=10万,那么耗时将指数级增加,大约需要运行1个小时。

回复

使用道具 举报

 楼主| 发表于 2017-4-2 09:07 | 显示全部楼层
本帖最后由 lbport 于 2017-4-2 16:30 编辑
香川群子 发表于 2017-4-1 20:29
代码确实有bug,计算结果是错的。

更正如下:

你好,运行了你的代码,应该是正确的!谢谢了!
只是有一两处不是很明白,第十二行的t = 0  第十四行的t = t + ar(i, 2),这个t难道是指B1到B(i-1)之和?
第十六行的   t1 = t: If t / n > r Then r = t / n: i1 = 1: n1 = n  
和第二十行的 If t > t1 Then t1 = t: If t / n > r Then r = t / n: i1 = i + 1: n1 = n
也不是太了解。
还有第二十七行的[d5] = "=D3/D2"  你应该是想写成  [d5] = "=D4/D3" 吧。

比如说这样,我取一个30行的样本,即m=30   n取值5-9 , 即m1=5   m2=9能为我说明一下吗?
还有,如果我要求最小值,要怎么修改代码呢?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-5-8 06:07 , Processed in 0.297131 second(s), 10 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表