はじめに
・キャッチアップした知識の備忘録です。
・間違い等あればご指摘いただけますと幸いです。
今回のキーワード
・to_a
メソッド
ハッシュ、範囲オブジェクトなどを配列に変換するメソッドです。
引用元:【Ruby】to_aメソッドの使い方を理解しよう
・shuffle
メソッド
shuffleメソッドは配列の要素をランダムに入れ替えて取得します。
引用元:はじめてのRuby!配列をランダムに取得・入れ替え|sample・shuffle
・join
メソッド
配列の要素を結合して一つの文字列としたい場合にjoinメソッドが使われます。joinメソッドは、配列の各要素を文字列に変換し、引数を区切り文字として結合します。
引用元:Rubyのjoinメソッドの使い方を現役エンジニアが解説【初心者向け】
結論:このように書きます
('a'..'z').to_a.shuffle[0..7].join
試しにターミナルでコマンドを実行してみます。
irb
と入力してからコマンド入力してください。
munetomokazushi@mba ~ % irb
irb(main):001:0> ('a'..'z').to_a.shuffle[0..7].join
=> "yahxwgti"
8文字のランダムなアルファベットが出力されました。
詳しく見ていきます
分解します。
irb(main):001:0> ('a'..'z')
まず、アルファベットの文字列'a'
から'z'
までの範囲であることを記述します。
..
はRangeオブジェクトです。..
なら最後の文字も含みますが、...
なら最後の文字を含みません。注意。
irb(main):001:0> ('a'..'z').to_a
=> ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]
.to_aメソッドで配列になりました。
irb(main):001:0> ('a'..'z').to_a.shuffle
=> ["o", "c", "q", "i", "m", "a", "k", "l", "t", "x", "z", "w", "n", "v", "b", "s", "h", "u", "r", "e", "g", "y", "f", "j", "p", "d"]
shuffleメソッドで配列がシャッフルされました。(実行するたびにシャッフルされます)
irb(main):001:0> ('a'..'z').to_a.shuffle[0..7]
=> ["r", "f", "b", "x", "y", "m", "g", "t"]
配列をシャッフルしたものを、最初から8文字分取得しています。
配列は0からスタートすることに注意。
irb(main):001:0> ('a'..'z').to_a.shuffle[0..7].join
=> "yahxwgti"
最後にjoinメソッドで配列の要素を結合してひとつの文字列にしました。
2020.8.24追記
コメントをいただいたので引用して追記させてください。
@nodai2h_ITCさま、ありがとうございます!
この方法では、「agrjesao」のような同じ文字が2回以上出てくる文字列が生成されません。たとえばじゃんけん三番勝負のプログラムを書くとして、一度出した手を出さないようなプログラムを書いたら「ランダムな手」とは言わないのではないでしょうか。
それに、この方法ではアルファベット文字数を超える例えば30文字のランダムなアルファベット文字列を作ることができません。
というわけで、同じ文字を許可した「ランダムなアルファベット文字列」を生成する方法としては、こんな感じでどうでしょうか。
chars = ('a'..'z').to_a # = *'a'..'z' でも可
8.times.map{ chars.sample }.join
この結果はこんな感じです。
irb(main):009:0> chars = ('a'..'z').to_a
=> ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]
irb(main):010:0> 8.times.map{ chars.sample }.join
=> "bjtaniyw"
irb(main):011:0> 8.times.map{ chars.sample }.join
=> "ntbtrdml"
irb(main):012:0> 8.times.map{ chars.sample }.join
=> "ajsgpcwn"
irb(main):013:0> 8.times.map{ chars.sample }.join
=> "vxdgakuc"
irb(main):014:0> 8.times.map{ chars.sample }.join
=> "xknqtmcq" # 同じアルファベットが2回出ています。ちゃんとランダムに表示されています
ランダムな文字列を生成するメソッドを定義してみる
# string_shuffleメソッドを定義
def string_shuffle(s)
s.split('').shuffle.join
end
# 呼び出してみる
string_shuffle("foobar")
# string_shuffleメソッドを呼び出した結果
=> "fboora"
ちなみに
irb(main):005:0> ('あ'..'ん').to_a.shuffle[0..7].join
=> "ごふくぽれかりそ"
ひらがなでもできます。
まとめ
・ランダムなサブドメインを作る時などにも活用できますね。
・コンソールで実行する場合はrails c
とターミナルで入力してコンソールを起動してください。
参考
【Ruby】to_aメソッドの使い方を理解しよう
はじめてのRuby!配列をランダムに取得・入れ替え|sample・shuffle
Rubyのjoinメソッドの使い方を現役エンジニアが解説【初心者向け】