本記事では、プログラミング言語Goでランダムな数値を生成する方法を紹介します。
目次
math/randパッケージを使用する
randパッケージには、さまざまな種類の乱数値のための複数の関数が含まれています。
まずは、 “math/rand” パッケージをインポートしてください。
ランダム数値を生成するための乱数シードの設定
乱数を生成するためには、シードを設定する必要があります。
乱数のシードを設定するにはrand.Seed(seed int64) という関数を使います。rand.Seed関数は入力としてint64を受け取り、それをシードとして設定します。
ここで一定のシードを設定すると、同じ数字が出力されます。そこで、呼び出すたびに変化する可変シードにする必要があり、timeを使うのはそのためです。
rand.Seed(time.Now().UnixNano())
Golangでランダムな整数を生成する
randパッケージの Intn() 関数は、0からnまでの区間にある整数を生成することができます。
また、与えられた引数が0より小さい場合、エラーを返します。
result := rand.Int() // ランダムな整数を生成します。
上記を改良して下限と上限を定義し、その範囲内でランダム生成するようにすることができます。
以下がそのやり方です。
result := rand.Intn(max-min) + min // minとmaxが範囲となる
浮動小数点型のランダムな数値を生成する方法
浮動小数点型乱数の生成は、int型乱数の生成と同じように簡単にできます。
0.0から1.0までの浮動小数点数を返すfloat64関数を使います。
rand.Float64()
ランダムな整数の配列を生成する
intの配列を生成するには、まず空の配列を作成します。そして、そこにランダムなint型の値を追加します。
以下は、int型の配列を生成するコード例です。
package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
var randomArray [4]int
rand.Seed(time.Now().UnixNano())
for i:=0; i<4; i++ {
randomArray[i] = rand.Intn(100)
}
fmt.Println(randomArray) // [8 50 96 60]
}
math/rand パッケージの Perm() メソッド
rand パッケージに含まれるperm関数は、0からnまでの整数のランダムな並べ替えを返します。
package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
rand.Seed(time.Now().UnixNano())
result := rand.Perm(5)
fmt.Println(result) // [5 4 3 1 2]
}
Golangで暗号化乱数を生成する方法
暗号用乱数を生成するには、”crypto/rand “パッケージを使用します。
“crypto/rand “パッケージのIntn()関数はランダムな整数を、Prime()関数はランダムな素数を生成することができます。
package main
import (
"crypto/rand"
"fmt"
)
func main() {
p, _ := rand.Prime(rand.Reader, 30)
fmt.Println(p) // 868787849
}