昨天在QQ问问上看见有人要一个根据行列数随机排座位的软件,呵呵,我还没见过此类软件。反正想想应该很简单,就打算给他编一个。用VS2008随便出来了一个,发过去竟然说不能用……我汗……没装.net的原因吧……
然后既然答应下来了就头痛地打开6年前玩过的VB6……苍天啊大地啊……突然发现VB6是那么的深奥,那么的艰辛,没有数组的排序,数组禁止赋值,定义数组不能带变量定义,类似b=10 : dim a(b) 竟然会出错。但是dim a(10)是正确的。我头痛…… 研究好半天发现b=10 : dim a() : redim a(b)竟然能通过。我无语啊…… 需要重定义吗……或许我学艺不精的缘故。
然后第一遍算法,出来后10*10没问题,就发过去了。后来发现数字越大,效率明显下降,超过500感觉有死机的假象。丫的改算法,改出来测试发现最后会出现两个0!
(O(∩_∩)O~)
主要的意图就是把从1到i*j的自然数乱序。结果应该保存在num数组里。
All = i * j 'i,j分别表示行列数
ReDim num(All), num1(All)
Dim x As Integer
For a = 0 To All - 1
num(a) = -1
num1(a) = a
Next
For a = 0 To All - 1
mx = All - a
Dim tmp(), tmp1() As Integer
ReDim tmp(mx), tmp1(mx)
Dim count As Integer
count = 0
For q = 0 To All - 1
If num1(q) >= 0 Then
tmp(count) = num1(q)
tmp1(count) = q
count = count + 1
End If
Next
Randomize Timer
x = Int(Rnd * mx)
num(a) = tmp(x)
num1(tmp1(x)) = -1
Next
如此代码不知道有什么问题,反正最后num数组会经常出现2个0(一个0,一个空值,计算的时候都是按0处理的)……望达人赐教为什么
不得已,找不到原因,加入纠错片段
cuo = 0
For a = 0 To All - 1
If num(a) = 0 Then
cuo = cuo + 1
If cuo > 1 Then
For zz = 0 To All - 1
If num1(zz) <> -1 Then
num(a) = num1(zz)
num1(zz) = -1
Exit For
End If
Next
End If
End If
Next
感觉很复杂的说……
反正最后程序的效率应该是明显提高了,不过有个文本框的限制,最多60000多字符吧,结果显示不到3000行就熄火了。貌似也没解决。
不过对方接收到感觉还不错,起码解决他的问题了,呵呵
总觉得代码中的算法应该还能改进,不会改了。
人生的第一个小程序就这样发布了!~~哇卡卡卡O(∩_∩)O~鄙人菜鸟,业余水平,纯属爱好,呵呵
下载地址:随机座位
补充:以上调试过程都是在winXP中调试的,经常出现2个0的情况,debug.print cuo的结果是1或者2,但是在win7中cuo总是1,反复测试没有2的情况出现。怪哉……XP……7……