【学習ログ】【Ruby】ミニロトで選択する番号をランダムに払い出すプログラム

※このページは過去に自分がRubyの勉強をしたときの学習ログです。誰かの参考になれば幸いです。
こんにちは。Chanmeiです。
私が毎週行っている楽しみのひとつに、ミニロトの購入があります。
ミニロトとは1〜31までの数字の中から異なる5つの数字を選択する数字式の宝くじのことです。
簡易なものであれば、数字の配列を用意してランダムに5つ払い出す仕組みを作れるのではないかと思い、Rubyで実装してみました。

この記事では、数字式選択くじであるミニロトで選択する数字をランダムに選ぶプログラムをRubyで実装してみるよ!
目次
ミニロトの番号をランダムに払い出すプログラムを作ってみた

最初に言っておきますが、この方法を実施することでミニロトの当選確率が上がるものではありません。
あくまで、プログラミングの練習の一環としてどうかお付き合いください。
完成コードいろいろ
単純に1〜31までの数字をランダムに払い出す
p (1..31).to_a.shuffle.take(5).sort
実行結果例 →[4, 9, 24, 25, 31]
なんと、たったこれだけでできてしまいます。
しかし、なんだかもの足りないので過去の当選番号を配列に入れて
そこから、ランダムに払い出すコードも作ってみました。
過去の当選番号を配列に入れてランダムに払い出す
def mini_loto(numbers) serect = numbers.uniq p serect # numbersの重複分を削除したもの serect.shuffle.take(5).sort end p mini_loto([3,8,14,18,26,6,17,18,20,29,1,7,19,20,25,1,3,8,11,14,9,19,20,22,26,1,5,14,21,30,7,8,19,27,3])
実行結果 →[3, 8, 14, 18, 26, 6, 17, 20, 29, 1, 7, 19, 25, 11, 9, 22, 5, 21, 30, 27]
(重複分を削除したもの)
ソート後→[1, 5, 8, 26, 29]
こちらは、出力結果自体は問題ありませんが、なんだか配列の要素にまとまりがなく、いざという際の修正にやりずらさを感じてしまうという欠点がありました。
そこで、gets
メソッドを利用してターミナルから値を入力できるように仕様を変えてみました。
さらに改良を重ねて
ターミナルから任意の値を入力できるようにする
関数mini_loto
を実行すると、ターミナルから任意の値を入力できるように改良したのが以下の方法です。
def mini_loto() x = [] #空の配列を用意 numbers = gets.split(" ").map!{|i | i.to_i} #1行で複数個の数字を受け取りnumbers変数へ代入 x << numbers #配列へ代入 serect = numbers.uniq #numbersの重複分を削除したものを変数serectへ代入 p serect # numbersの重複分を削除した結果表示 serect.shuffle.take(5).sort #変数serectに代入されている値からランダムで5つ取り出してソートする end p mini_loto()
入力 →3 8 14 18 26 6 17 19 19 20 2 31 30 21 25 26
実行結果 →[3, 8, 14, 18, 26, 6, 17, 19, 20, 2, 31, 30, 21, 25]
(重複分を削除したもの)
ソート後→[2, 17, 18, 21, 30]
入力方法は数字+スペース+数字という風に試しました。
どうやらgets.split(" ").map!{|i | i.to_i}
とは、1行の文字列で入力された複数の値を分割して、破壊的メソッドで元の値を無理矢理数値に書き換える処理を行っているようです。
本日は以上となります。
最後までお読みくださりありがとうございました。
Follow @punibastet