第3講 第2講の魔方陣を高速化しよう!
第6話 魔方陣プログラム2の改良
改良は、乱数を使います。
各セルに1から順に入れていったのでは展望がないので、
1から36の整数のうちからアットランダムに入れていこうというわけです。
ソースの改良点は
kk = 0
If n = 6 Then
kk = Int(Rnd * n * n)
End If
For k = 1 To n * n
kkk = (k + kk - 1) Mod n * n + 1
mah(i, j) = kkk
'Cells(i + 5, 1 + j) = mah(i, j)
hh = 0
If tyouhukuhantei(kkk - 1) = 1 Then GoTo owari
tyouhukuhantei(kkk - 1) = 1
・
・
If hh = 1 Then tyouhukuhantei(kkk - 1) = 0
です。
Rndは1未満の小数をアットランダムに発生させる乱数です。
したがって、kk = Int(Rnd * n * n)は36未満で0以上の整数を発生させています。
(k + kk - 1) Mod n * nは、
(k + kk - 1)を36で割った余りです。
36以上になった場合、36未満に戻すためです。
例えば、kk = 11だった場合は、
11,12,13,・・・,35,0,1,2,・・・,10
のように動いていきます。
ですから (k + kk - 1) Mod n * n + 1はそれに1が加わり、
12,13,14,・・・,36,1,2,3,・・・,11
結局for文の始まりをRndによってランダムにしているわけです。
しかし、順番がどうであれすべての場合を繰り返すことがわかります。
以上の改良で魔方陣プログラム3ができあがります。
なおメインプロシージャの
'rndj = Cells(2, 9)
If n = 6 Then
For i = 0 To 21
Rnd
Next
End If
はRndの空打ちです。
21という数字は0から40まで空打ち実験をして最も6次魔方陣が速くできるものを選びました。
はじめ
rndj = Cells(2, 9)
If n = 6 Then
For i = 0 To rndj
Rnd
Next
End If
としておいてI2にいろいろな数字を入れて、
実験して最も速くなる数字を見つけてから、
上のように記述を変えました。