LoginSignup
2
3

More than 3 years have passed since last update.

【Ruby】ランダムなアルファベット文字列を生成する方法

Last updated at Posted at 2020-08-22

はじめに

・キャッチアップした知識の備忘録です。
・間違い等あればご指摘いただけますと幸いです。

今回のキーワード

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メソッドの使い方を現役エンジニアが解説【初心者向け】

2
3
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3