【Golang】簡易おみくじシステムの作成

2月 12, 2022

どもです。Supremeのちょっと攻めたデザインが大好きなsaisaiです。


今回は僕と同じ初心者Gopherに向けて、簡易的なおみくじコードの作成方法をご紹介します。


といってもググればいろんな記事が紹介しているありふれた実装方法ですが、初心者なりに理解したことを備忘録として残しておきます。

Randパッケージ

今回のおみくじコードにはRandパッケージを利用します。Randパッケージは乱数を生成する際に用いるパッケージです。乱数とは平たく言えばランダムな数値ですね。使用方法は以下の通りです。

rand.Seed(生成する乱数の判断元とする数字列)
	luck := rand.Intn(n) 
//Seedに格納された数字列を参考に乱数を生成し変数に代入。生成範囲は0<=乱数<n

IntnはSeedに格納された数字列を参考に乱数を出力します。つまり、このおみくじコードが呼び出されたタイミングで毎回異なる文字数がSeedに格納されるようにする必要があります。例えば、以下のようにして実装できます。

seed := time.Now().UnixNano() //現在時刻のナノ秒を変数に代入
 fmt.Println(seed) //例:1612520359603811000
 rand.Seed(time.Now().UnixNano()) //シードに上記の数字列がSeed格納される
luck := rand.Intn(11) //Seedに格納された数字列を参考に10以下の乱数を生成し変数に代入
	fmt.Println(luck) //8(今回算出された乱数)

コードが実行される度に異なった数値を出力することができました。あとは、数値によって結果を出力する条件分岐を作成しましょう。最終的なコードは以下の通りです。

package main

import (
	"fmt"
	"math/rand"
	"time"
)

func main() {
	rand.Seed(time.Now().UnixNano())
	luck := rand.Intn(12)
	switch luck {
	case 0:
		fmt.Println("大吉")
	case 1, 2:
		fmt.Println("中吉")
	case 3, 4, 5:
		fmt.Println("小吉")
	case 6, 7, 8:
		fmt.Println("末吉")
	case 9, 10:
		fmt.Println("吉")
	case 11:
		fmt.Println("凶")
	}
}

簡易的なおみくじコードが完成しましたね!

ひとこと

今回はRandパッケージを使用した簡易的なおみくじコードの作成方法をご紹介いたしました。


今回のコードはあくまで簡易的なものであり、乱数が流出することが許されないセキュアなシステムなどでは使用せず、あくまでおみくじ程度の使用にとどめていただくのがよろしいかと思います。


なぜかというと、今回の乱数生成は時間要素を元としているため出力した時間帯などで乱数の元となる数字列を第三者が予測できてしまう恐れがあるためです…。


よりセキュアな乱数出力をご希望される方は以下の記事が参考になります。チェックしてみてください!

Goのmath/randとcrypto/rand


ここまで読んでいただきありがとうございました!

-saisai-


↓本日のオススメ教材

Golang

Posted by CY