第13講 プロシージャの再帰的使用による数独の自動生成
第6話 数独解答自動生成ソフトにランダム要素を組み込む
コード改良部分
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通りの飛び方のどれを取るかも、
ランダムに変更するにはどうしたらよいですか。
初心者のためのc++ vc++ c言語 入門 基礎から応用までへ
初心者のための excel 2007 2010 2013 vba マクロ 入門 基礎から応用まで
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
vb講義トップへ
VB講義基礎へ
専門用語なしのC++入門へ
専門用語なしのJava入門へ
専門用語なしのVBA入門
数独のページ
魔方陣のページ
数学研究室に戻る
本サイトトップへ