GoにおけるRandomな数の生成
Wenhao Wang
Dev Intern · Leapcell

Key Takeaways
math/rand
パッケージは、Goにおける疑似乱数生成を提供します。time.Now().UnixNano()
を使ったシードは、実行ごとに異なるシーケンスを保証します。math/rand
の代わりに、暗号論的乱数にはcrypto/rand
を使用してください。
乱数は、シミュレーション、ゲーム、セキュリティプロトコルなど、さまざまなプログラミングシナリオで不可欠です。Goでは、math/rand
パッケージが疑似乱数を生成する機能を提供します。この記事では、このパッケージを効果的に活用する方法を探ります。
math/rand
パッケージのインポート
まず、必要なパッケージをインポートします。
import ( "fmt" "math/rand" "time" )
整数の生成
rand.Intn
関数は、[0, n)
の範囲の非負の疑似乱整数を返します。例:
fmt.Print(rand.Intn(100), ",") fmt.Print(rand.Intn(100)) fmt.Println()
このコードは、0から99の間の2つの乱数を生成します。
浮動小数点数の生成
浮動小数点数の場合、rand.Float64
は[0.0, 1.0)
の範囲の疑似乱数を生成します。
fmt.Println(rand.Float64())
特定の範囲内の浮動小数点数を生成するには、それに応じて出力を調整します。
fmt.Print((rand.Float64()*5)+5, ",") fmt.Print((rand.Float64() * 5) + 5) fmt.Println()
このスニペットは、[5.0, 10.0)
の範囲の数値を生成します。
乱数ジェネレーターのシード
デフォルトでは、Goの乱数ジェネレーターは、決定論的なシードを使用するため、プログラムを実行するたびに同じ数列を生成します。実行ごとに異なるシーケンスを保証するには、現在の時刻を使用して一意のシードを提供します。
s1 := rand.NewSource(time.Now().UnixNano()) r1 := rand.New(s1)
これで、r1
を使用すると、実行ごとに異なるシーケンスが生成されます。
fmt.Print(r1.Intn(100), ",") fmt.Print(r1.Intn(100)) fmt.Println()
固定シードによるシーケンスの再現
テストまたはデバッグの目的で、同じ乱数のシーケンスを再現したい場合があります。これは、固定シードを使用することで実現できます。
s2 := rand.NewSource(42) r2 := rand.New(s2) fmt.Print(r2.Intn(100), ",") fmt.Print(r2.Intn(100)) fmt.Println()
同じシード値(例:42
)を使用すると、r2
はプログラムを実行するたびに同じシーケンスを生成します。
暗号論的な使用に関する注意
math/rand
パッケージは一般的な目的に適していますが、暗号論的なアプリケーションには適していません。暗号論的な乱数については、crypto/rand
パッケージの使用を検討してください。このパッケージは、安全な乱数データを生成するためのrand.Read
のような関数を提供します。
結論
Goのmath/rand
パッケージは、疑似乱数を生成するための簡単な方法を提供します。ジェネレーターにシードを設定する方法と、目的の範囲内で数値を生成する方法を理解することで、開発者はアプリケーションにランダム性を効果的に組み込むことができます。詳細と例については、Go by Example: Random Numbersページを参照してください。
FAQs
それは決定論的なシードを使用しているためです。time.Now().UnixNano()
を使用してランダム化してください。
(rand.Float64() * 5) + 5
を使用して出力をスケーリングします。
パスワード生成などのセキュリティが重要なアプリケーションには、crypto/rand
を使用してください。
Goプロジェクトのホスティングに最適なLeapcellはこちらです。
Leapcellは、Webホスティング、非同期タスク、Redisのための次世代サーバーレスプラットフォームです。
マルチ言語サポート
- Node.js、Python、Go、またはRustで開発。
無制限のプロジェクトを無料でデプロイ
- 使用量に応じてのみ支払い - リクエストもチャージもなし。
比類なきコスト効率
- アイドルチャージなしの従量課金制。
- 例:25ドルで平均応答時間60msで694万リクエストをサポート。
合理化された開発者エクスペリエンス
- 簡単なセットアップのための直感的なUI。
- 完全に自動化されたCI/CDパイプラインとGitOps統合。
- 実用的な洞察のためのリアルタイムメトリックとロギング。
簡単なスケーラビリティと高性能
- 簡単な高並行処理に対応する自動スケーリング。
- 運用オーバーヘッドゼロ - 構築に集中するだけ。
詳細については、ドキュメントをご覧ください!
Xでフォローしてください:@LeapcellHQ