HOWTO · Go

Go での乱数生成

このチュートリアルでは、GoLang で乱数生成機能を使用する方法を示します。

このページの内容

このチュートリアルでは、GoLang で乱数生成機能を使用する方法を示します。

Go での乱数生成

GoLang は、乱数生成機能の組み込みサポートを提供します。 組み込みパッケージ math には、乱数生成に使用されるメソッド rand() があります。

math/rand メソッドは疑似乱数を生成します。 rand() メソッドは、0 と n の間の乱数を生成できます。

このメソッドの構文は次のとおりです。

RandomNumber := rand.Intn()

Intn() メソッドは n の整数値を指定します。 例を試してみましょう:

package main

import (
    "fmt"
    "math/rand"
)

func main() {

    // Generating numbers between `0 <= n < 100`.
    fmt.Print(rand.Intn(100), "\n")
    fmt.Print(rand.Intn(100), "\n")
    fmt.Print(rand.Intn(100), "\n")
    fmt.Print(rand.Intn(100), "\n")
    fmt.Print(rand.Intn(100))
    fmt.Println()

}

上記のコードは、0 から 100 までの乱数を生成します。出力を参照してください。

81
87
47
59
81

特定の範囲内の乱数を生成する

rand.Intn() は 0 から指定された数値の間の乱数を生成しますが、指定された範囲内の乱数を生成したい場合はどうすればよいでしょうか? 同様の方法で、単純な数学演算で特定の範囲内の乱数を生成できます。

例を参照してください。

package main

import (
    "fmt"
    "math/rand"
)

func main() {
    minrange := 20
    maxrange := 45
    fmt.Println(rand.Intn(maxrange-minrange)+minrange, "\n")
    fmt.Println(rand.Intn(maxrange-minrange)+minrange, "\n")
    fmt.Println(rand.Intn(maxrange-minrange)+minrange, "\n")
    fmt.Println(rand.Intn(maxrange-minrange)+minrange, "\n")
    fmt.Println(rand.Intn(maxrange-minrange) + minrange)

}

上記のコードは、20 から 45 の間の乱数を生成します。出力を参照してください。

26

32

42

29

26

Program exited.

乱数の配列を生成する

同様に、rand() メソッドを使用して乱数の配列を生成できます。 for ループを使用して数値を生成し、配列に入れるだけです。

例を参照してください。

package main

import (
    "fmt"
    "math/rand"
)

func RandomArray(ArrayLength int) []int {

    arr := make([]int, ArrayLength)

    for i := 0; i <= ArrayLength-1; i++ {

        arr[i] = rand.Intn(ArrayLength)
    }

    return arr
}

func main() {

    ArrayLength := 15
    fmt.Println(RandomArray(ArrayLength))
}

上記のコードは、長さ 15 の乱数の配列を生成します。出力を参照してください。

[11 12 2 14 1 3 10 5 1 0 14 1 12 14 13]

Program exited.

乱数を生成する前のシード

seed() メソッドは、乱数の生成をどこから開始するかを指定するために使用されます。これは、rand() メソッドが前の値に対して何らかの操作を実行して数値を生成するためです。

これは、実際の乱数に近いシードを提供するために乱数を生成する最も重要な部分です。 例を試してみましょう:

package main

import (
    "fmt"
    "math/rand"
)

func main() {

    rand.Seed(30)
    fmt.Printf("%d ", rand.Intn(150))
    fmt.Printf("%d ", rand.Intn(150))
    fmt.Printf("%d \n", rand.Intn(150))

    rand.Seed(30)
    fmt.Printf("%d ", rand.Intn(150))
    fmt.Printf("%d ", rand.Intn(150))
    fmt.Printf("%d \n", rand.Intn(150))

    rand.Seed(30)
    fmt.Printf("%d ", rand.Intn(150))
    fmt.Printf("%d ", rand.Intn(150))
    fmt.Printf("%d \n", rand.Intn(150))

    fmt.Println()
}

上記のコードは、rand メソッドに同じ値を 3 回シードします。 次に、乱数ジェネレーターは、同じシード値を見つけるたびに同じ数値を生成します。

出力を参照してください。

138 16 41
138 16 41
138 16 41

Program exited.

Rand を使用してランダムな文字列を生成する

bytes の助けを借りて rand メソッドを使用してランダムな文字列を生成できます。 特定の範囲内の数値を生成するメソッドの助けも必要です。

例を試してみましょう:

package main

import (
    "fmt"
    "math/rand"
)

func GenerateRandomString(StringLength int) string {

    StringBytes := make([]byte, StringLength)

    for i := 0; i < StringLength; i++ {
        StringBytes[i] = byte(RandNumberinRange(65, 122))
    }

    return string(StringBytes)
}

func RandNumberinRange(minnumber int, maxnumber int) int {

    return minnumber + rand.Intn(maxnumber-minnumber)
}

func main() {
    fmt.Println(GenerateRandomString(25))
}

上記のコードは、大文字、小文字、およびいくつかの記号を含む 65 ~ 122 の ASCII コードを使用して、ランダムな文字列を生成します。 長さ 25 の文字列が生成されます。

出力を参照してください。

FbpXH\fgTAvxtUxCbvLXXVOle

指定された文字列または要素からランダムな文字を出力することもできます。 例を見てみましょう:

package main

import (
    "fmt"
    "math/rand"
)

func main() {

    DemoRune := []rune("DELFTSTACK")

    Result := DemoRune[rand.Intn(len(DemoRune))]

    fmt.Println(string(Result))
}

Rune は、Unicode 文字を表すために使用されるコードを格納するために使用されるデータ型です。 上記のコードは、指定された文字列からランダムな文字を出力します。

出力を参照してください。

E

Program exited.