はじめに
アルゴリズムの勉強をする上に、実装したアルゴリズム検証用に毎回テスト用の配列を作るのはめんどくさい。。。
そのため、アルゴリズム検証用にランダムな並びをもつ配列の作成方法を検討しました。
実行環境
- macOS Big Sur 11.1
- go 1.14
配列をつくる
ベースとなる配列を作ってみます。
package main
import "fmt"
func main() {
nums := []int{2, 5, 3, 8, 7, 1}
fmt.Println(nums)
}
実行すると以下のように出力されます。
$ go run main.go
[2 5 3 8 7 1]
配列ができていることが確認できます。
しかし、このままでは複数の配列を試すのにいちいち配列の中身を入れ替えないといけません。
配列の中身をランダム化する
math/rand
パッケージを導入し配列の中身をランダムにします。
引数に配列を指定し、0から1000までのランダムな値を配列の中身に入れるrandomValue
関数を作成します。
func randomValue(values []int) []int {
lenVaules := len(values)
for i := 0; i < lenVaules; i++ {
values[i] = rand.Intn(1000)
}
return values
}
上記の関数をmain.go
に追加し配列を作成します。
package main
import (
"fmt"
"math/rand"
)
func randomValue(values []int) []int {
lenVaules := len(values)
for i := 0; i < lenVaules; i++ {
values[i] = rand.Intn(1000)
}
return values
}
func main() {
// 空の配列を作成
nums1 := make([]int, 10)
nums2 := make([]int, 10)
// 作成した関数を利用しランダムな値を代入
randomValue(nums1)
randomValue(nums2)
fmt.Println("nums1: ", nums1)
fmt.Println("nums2: ", nums2)
}
実行した結果は以下になります。
$ go run main.go
nums1: [81 887 847 59 81 318 425 540 456 300]
nums2: [694 511 162 89 728 274 211 445 237 106]
ランダムな値が設定されていることが確認できます。
しかし、上記の場合、乱数を生成する際に一定のシード値を元に作成しているため、
実行するたびに同じ結果となります。
実行する度に異なる値を試すことができず不便です。
実行するたびに異なる値が生成されるようにする
実行する度に異なる値が呼べるようにSeed関数を利用します。
time
パッケージを追加し、time.Now().UnixNano()
をシード値にすることで実行する度に異なる値が得られるようにします。
package main
// time を追加
import (
"fmt"
"math/rand"
"time"
)
func randomValue(values []int) []int {
lenVaules := len(values)
rand.Seed(time.Now().UnixNano()) // 追加部分
for i := 0; i < lenVaules; i++ {
values[i] = rand.Intn(1000)
}
return values
}
func main() {
nums1 := make([]int, 10)
nums2 := make([]int, 10)
randomValue(nums1)
randomValue(nums2)
fmt.Println("nums1: ", nums1)
fmt.Println("nums2: ", nums2)
}
以下のように実行する度に配列の中身がランダムに変わることが確認できます。
$ go run main.go
nums1: [402 966 929 144 151 894 788 951 644 412]
nums2: [179 436 524 222 937 729 362 14 621 166]
まとめ
関数を利用しランダムな配列を作成できるようになりました。
今回作成した関数を利用し、実際にアルゴリズムによって配列がソートされるか検証していきたいと思います。