Option Explicit
Sub 乱数設定()
Dim ws As Worksheet
Set ws = ActiveSheet
Dim wcol As Long
Dim i As Long
Dim randval As Variant
randval = GetRandArray(8, 19, 4, 2)
i = 1
For i = 1 To 4
wcol = i + 1
ws.Cells(3, wcol).Value = randval(i)
Next
End Sub
'ランダムな整数を配列にして返す関数
'sn:整数の最小値
'en:整数の最大値
'size:配列のサイズ(配列の要素数)(配列の添え字は1から開始する)
'diff:隣り合う要素間の差の最小値
Private Function GetRandArray(ByVal sn As Long, ByVal en As Long, ByVal size As Long, ByVal diff As Long) As Variant
Const try_limit As Long = 10000 'トライ回数上限
Dim isUsed() As Boolean '使用済み整数
Dim randval() As Long '戻り値用配列(ランダムな整数の配列)
Dim i As Long '作業変数
Dim x As Long 'randval用添え字
Dim num As Long '取得したランダム数
Dim try_count As Long: try_count = 0 'トライ回数カウンター
ReDim isUsed(0 To en - sn) '配列の確保(0始まり)
ReDim randval(1 To size) '配列の確保(1始まり)
'配列の先頭から順に整数を割り当てる
For x = 1 To size
'割り当てが完了するまで繰り返す
Do While (True)
'sn~enの範囲でランダムな整数を取得する
num = Application.RandBetween(sn, en)
'トライ回数が上限を超えた場合、戻り値用配列に全て0を設定し、強制終了する
try_count = try_count + 1
If try_count > try_limit Then
For i = 1 To size
randval(i) = 0
Next
Exit For
End If
'取得した整数が未使用なら、割り当てを行う
If isUsed(num - sn) = False Then
Dim isValid As Boolean: isValid = False '有効か否かの判定
'先頭の要素は、無条件に有効とする
If x = 1 Then
isValid = True
Else
'隣の要素との差が、diff以上ならなら有効とする
If Abs(num - randval(x - 1)) >= diff Then
isValid = True
End If
End If
'取得した整数が有効なら、その整数を割り当てる
If isValid = True Then
isUsed(num - sn) = True
randval(x) = num
Exit Do
End If
End If
Loop
Next
'戻り値用配列を戻り値に設定する
GetRandArray = randval
End Function
T3B0aW9uIEV4cGxpY2l0CgpTdWIg5Lmx5pWw6Kit5a6aKCkKICAgIERpbSB3cyBBcyBXb3Jrc2hlZXQKICAgIFNldCB3cyA9IEFjdGl2ZVNoZWV0CiAgICBEaW0gd2NvbCBBcyBMb25nCiAgICBEaW0gaSBBcyBMb25nCiAgICBEaW0gcmFuZHZhbCBBcyBWYXJpYW50CiAgICByYW5kdmFsID0gR2V0UmFuZEFycmF5KDgsIDE5LCA0LCAyKQogICAgaSA9IDEKICAgIEZvciBpID0gMSBUbyA0CiAgICAgICAgd2NvbCA9IGkgKyAxCiAgICAgICAgd3MuQ2VsbHMoMywgd2NvbCkuVmFsdWUgPSByYW5kdmFsKGkpCiAgICBOZXh0CkVuZCBTdWIKJ+ODqeODs+ODgOODoOOBquaVtOaVsOOCkumFjeWIl+OBq+OBl+OBpui/lOOBmemWouaVsAonc2465pW05pWw44Gu5pyA5bCP5YCkCidlbjrmlbTmlbDjga7mnIDlpKflgKQKJ3NpemU66YWN5YiX44Gu44K144Kk44K677yI6YWN5YiX44Gu6KaB57Sg5pWw77yJ77yI6YWN5YiX44Gu5re744GI5a2X44GvMeOBi+OCiemWi+Wni+OBmeOCi++8iQonZGlmZjrpmqPjgorlkIjjgYbopoHntKDplpPjga7lt67jga7mnIDlsI/lgKQKUHJpdmF0ZSBGdW5jdGlvbiBHZXRSYW5kQXJyYXkoQnlWYWwgc24gQXMgTG9uZywgQnlWYWwgZW4gQXMgTG9uZywgQnlWYWwgc2l6ZSBBcyBMb25nLCBCeVZhbCBkaWZmIEFzIExvbmcpIEFzIFZhcmlhbnQKICAgIENvbnN0IHRyeV9saW1pdCBBcyBMb25nID0gMTAwMDAgICAgICAgICAn44OI44Op44Kk5Zue5pWw5LiK6ZmQCiAgICBEaW0gaXNVc2VkKCkgQXMgQm9vbGVhbiAgICAgICAgICAgICAgICAgJ+S9v+eUqOa4iOOBv+aVtOaVsAogICAgRGltIHJhbmR2YWwoKSBBcyBMb25nICAgICAgICAgICAgICAgICAgICfmiLvjgorlgKTnlKjphY3liJfvvIjjg6njg7Pjg4Djg6DjgarmlbTmlbDjga7phY3liJfvvIkKICAgIERpbSBpIEFzIExvbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAn5L2c5qWt5aSJ5pWwCiAgICBEaW0geCBBcyBMb25nICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JhbmR2YWznlKjmt7vjgYjlrZcKICAgIERpbSBudW0gQXMgTG9uZyAgICAgICAgICAgICAgICAgICAgICAgICAn5Y+W5b6X44GX44Gf44Op44Oz44OA44Og5pWwCiAgICBEaW0gdHJ5X2NvdW50IEFzIExvbmc6IHRyeV9jb3VudCA9IDAgICAgJ+ODiOODqeOCpOWbnuaVsOOCq+OCpuODs+OCv+ODvAogICAgUmVEaW0gaXNVc2VkKDAgVG8gZW4gLSBzbikgICAgICAgICAgICAgICfphY3liJfjga7norrkv53vvIgw5aeL44G+44KK77yJCiAgICBSZURpbSByYW5kdmFsKDEgVG8gc2l6ZSkgICAgICAgICAgICAgICAgJ+mFjeWIl+OBrueiuuS/ne+8iDHlp4vjgb7jgorvvIkKICAgICfphY3liJfjga7lhYjpoK3jgYvjgonpoIbjgavmlbTmlbDjgpLlibLjgorlvZPjgabjgosKICAgIEZvciB4ID0gMSBUbyBzaXplCiAgICAgICAgJ+WJsuOCiuW9k+OBpuOBjOWujOS6huOBmeOCi+OBvuOBp+e5sOOCiui/lOOBmQogICAgICAgIERvIFdoaWxlIChUcnVlKQogICAgICAgICAgICAnc27vvZ5lbuOBruevhOWbsuOBp+ODqeODs+ODgOODoOOBquaVtOaVsOOCkuWPluW+l+OBmeOCiwogICAgICAgICAgICBudW0gPSBBcHBsaWNhdGlvbi5SYW5kQmV0d2VlbihzbiwgZW4pCiAgICAgICAgICAgICfjg4jjg6njgqTlm57mlbDjgYzkuIrpmZDjgpLotoXjgYjjgZ/loLTlkIjjgIHmiLvjgorlgKTnlKjphY3liJfjgavlhajjgaYw44KS6Kit5a6a44GX44CB5by35Yi257WC5LqG44GZ44KLCiAgICAgICAgICAgIHRyeV9jb3VudCA9IHRyeV9jb3VudCArIDEKICAgICAgICAgICAgSWYgdHJ5X2NvdW50ID4gdHJ5X2xpbWl0IFRoZW4KICAgICAgICAgICAgICAgIEZvciBpID0gMSBUbyBzaXplCiAgICAgICAgICAgICAgICAgICAgcmFuZHZhbChpKSA9IDAKICAgICAgICAgICAgICAgIE5leHQKICAgICAgICAgICAgICAgIEV4aXQgRm9yCiAgICAgICAgICAgIEVuZCBJZgogICAgICAgICAgICAn5Y+W5b6X44GX44Gf5pW05pWw44GM5pyq5L2/55So44Gq44KJ44CB5Ymy44KK5b2T44Gm44KS6KGM44GGCiAgICAgICAgICAgIElmIGlzVXNlZChudW0gLSBzbikgPSBGYWxzZSBUaGVuCiAgICAgICAgICAgICAgICBEaW0gaXNWYWxpZCBBcyBCb29sZWFuOiBpc1ZhbGlkID0gRmFsc2UgICAgICfmnInlirnjgYvlkKbjgYvjga7liKTlrpoKICAgICAgICAgICAgICAgICflhYjpoK3jga7opoHntKDjga/jgIHnhKHmnaHku7bjgavmnInlirnjgajjgZnjgosKICAgICAgICAgICAgICAgIElmIHggPSAxIFRoZW4KICAgICAgICAgICAgICAgICAgICBpc1ZhbGlkID0gVHJ1ZQogICAgICAgICAgICAgICAgRWxzZQogICAgICAgICAgICAgICAgJ+mao+OBruimgee0oOOBqOOBruW3ruOBjOOAgWRpZmbku6XkuIrjgarjgonjgarjgonmnInlirnjgajjgZnjgosKICAgICAgICAgICAgICAgICAgICBJZiBBYnMobnVtIC0gcmFuZHZhbCh4IC0gMSkpID49IGRpZmYgVGhlbgogICAgICAgICAgICAgICAgICAgICAgICBpc1ZhbGlkID0gVHJ1ZQogICAgICAgICAgICAgICAgICAgIEVuZCBJZgogICAgICAgICAgICAgICAgRW5kIElmCiAgICAgICAgICAgICAgICAn5Y+W5b6X44GX44Gf5pW05pWw44GM5pyJ5Yq544Gq44KJ44CB44Gd44Gu5pW05pWw44KS5Ymy44KK5b2T44Gm44KLCiAgICAgICAgICAgICAgICBJZiBpc1ZhbGlkID0gVHJ1ZSBUaGVuCiAgICAgICAgICAgICAgICAgICAgaXNVc2VkKG51bSAtIHNuKSA9IFRydWUKICAgICAgICAgICAgICAgICAgICByYW5kdmFsKHgpID0gbnVtCiAgICAgICAgICAgICAgICAgICAgRXhpdCBEbwogICAgICAgICAgICAgICAgRW5kIElmCiAgICAgICAgICAgIEVuZCBJZgogICAgICAgIExvb3AKICAgIE5leHQKICAgICfmiLvjgorlgKTnlKjphY3liJfjgpLmiLvjgorlgKTjgavoqK3lrprjgZnjgosKICAgIEdldFJhbmRBcnJheSA9IHJhbmR2YWwKRW5kIEZ1bmN0aW9uCg==