第13講 プロシージャの再帰的使用による数独の自動生成
第6話 数独解答自動生成ソフトにランダム要素を組み込む

vba

コード改良部分
Private Sub CommandButton1_Click()
  Dim n As Byte, cn As Integer, x(10, 10) As Byte
  Rows("5").Select
  Selection.ClearContents
  Range("A1").Select
  
Randomize (Timer)
  n = 9
  cn = 0
  Call f(0, cn, n, x())
End Sub
Sub f(g As Byte, cn As Integer, n As Byte, x() As Byte)
  Dim h As Byte, i As Byte, j As Byte, k As Byte, a As Byte, s As Integer, gi As Byte, gj As Byte
  Dim ji As Byte, jj As Byte, hh As Byte, w As Byte,
ii As Byte, iii As Byte
  a = cn Mod 10
  s = Int(cn / 10)
  gi = Int(g / n)
  gj = g Mod n
  ii = Int(n * Rnd)
  For i = 1 To n
    
iii = (i - 1 + ii) Mod n
    x(gi, gj) =
iii + 1
        ・・・
        ・・・
        ・・・
参考ファイル

解説
  Randomize (Timer)
は現在の時刻をシード値にしています。
シード値とは、乱数の種という意味で
ランダムの系列を変更するための値です。
これを入れないと、
毎回同じ順番で乱数が現れてしまいます。
現在時刻をシード値(乱数の種)にしておくと、
毎回異なる乱数系列になります。

さて、今回の変更は、始まりこそランダムですが、
7→8→9→1→2→3→4→5→6
のように1つずつ動いています。
実は、動き方は
7→9→2→4→6→8→1→3→5
と2つ飛びで動いてもすべてを網羅できます。
また、
7→2→6→1→5→9→4→8→3
と4つ飛びで動いてもすべて網羅できます。
ただし、3つ飛びは
7→1→4→7→1→4→7→1→4
と動いてしまいすべてを網羅できません。
いくつ飛ぶのかを9未満とすると、
すべてを網羅する動き方をする飛び方を全部当ててみてください。
答えは、30行ほど下。





















1つ飛び、2つ飛び、4つ飛び、 5つ飛び、7つ飛び、8つ飛び

7→8→9→1→2→3→4→5→6(1つ飛び)
7→9→2→4→6→8→1→3→5(2つ飛び)
7→2→6→1→5→9→4→8→3(4つ飛び)
7→3→8→4→9→5→1→6→2(5つ飛び)
7→5→3→1→8→6→4→2→9(7つ飛び)
7→6→5→4→3→2→1→9→8(8つ飛び)

の6通りです。

だめな飛び方は3つ飛び、6つ飛びです。
可能のな飛び方は(n、9)が互いに素な場合のみです。
互いに素とは、共通の約数が1しかない状態をいいます。

6通りの飛び方のどれを取るかも、
ランダムに変更するにはどうしたらよいですか。
初心者







第5話へ 第7話へ



トップ

初心者のためのc++ vc++ c言語 入門 基礎から応用までへ
初心者のための excel 2007 2010 2013 vba マクロ 入門 基礎から応用まで
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
vb講義トップへ
VB講義基礎へ
専門用語なしのC++入門へ
専門用語なしのJava入門へ
専門用語なしのVBA入門

数独のページ
魔方陣のページ
数学研究室に戻る
本サイトトップへ