第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にいろいろな数字を入れて、
実験して最も速くなる数字を見つけてから、
上のように記述を変えました。


第3講第5話へ
 第4講第1話へ


VB入門講義応用編トップへ

VB入門講義トップへ