【Ruby入門】randomを使いこなす!【数値、文字列、array、secure】

こんにちは! フリーエンジニアの長瀬です。

今回はRubyのrandom、乱数を生成する方法について解説していきます!

一概に乱数と言っても乱数には色々な種類がありケースごとに使い分けていかないといけません。

この記事では、rubyでのrandomの扱い方について

【基礎】Rubyにおけるランダム(random)
【基礎】乱数の種を設定する
【基礎】ランダムな数字の生成
【発展】ランダムな文字列の生成
【発展】ランダムにarrayをシャッフル
【発展】ランダムに配列の要素を取り出す
【発展】securerandomを使って、ユニークな数値を作成する

といった応用的な内容についても解説していきます。

乱数とは

乱数とは規則性のない数字のことで、

3、70、-10、32、-9、62・・・

のようにランダムに割り当てられた数字のことをいいます。

プログラミングの分野では乱数を使用する機会が多く、すごろくのゲームや表示順をランダムに並び替えを行うとき、パスワードの自動生成などでよく使われます。

Rubyではそんな乱数を生成するためにいくつかの方法が用意されています。

次項ではさっそく使い方についてみていきましょう。

ランダム(random)の基本的な使い方

Rubyにおけるランダム(random)

Untitled design

Rubyでランダムな数字(乱数)を発生させるための方法は以下の2つです。

  • Kernelクラスに定義されたrandメソッド
  • Randomクラスに定義されたrandメソッド

主な違いはFloat(少数点を含んだ数値)を扱うことができるかです。

Kernel#randはFloatをそのまま扱うことができませんが、Random#randはFloatを受け取って、Floatの乱数を発生させることができます。

乱数の種を設定する

seed_ruby_random

すべてのプログラミングにおいて乱数の種を理解することは大切です。

乱数の種とは、乱数を生成する際に元となる数値のことです。

実はプログラミング上の乱数は擬似乱数と呼ばれ、「本物の乱数」とは区別されます。

「擬似ってことは完全にランダムな数値ではないってこと?」

そうなんです。実はプログラミング上の乱数は残念ながら完璧にランダムな数値ではありません。

なので、同じ乱数の種からは同じ乱数が順番に生成されます。

ということは、本物の乱数により近づけていくためには乱数の種を毎回変えて乱数を生成するべきです。

rubyで乱数の種を設定する方法はそれぞれ

  • Kernel#randのsrandメソッド
  • Random#randの初期値

です。

では、それぞれサンプルコードで確認していきましょう。

[Kernel#randの場合]

[実行結果]

[Random#randの場合]

[実行結果]

このように、同じ乱数の種(88)を渡した結果は常に同じになっていることがわかります。

また、今回は乱数の種を手動で入力しましたが、乱数の種を設定する方法にはよく現在時刻が使用されます。

現在時刻であれば、完璧にランダムではありませんがある程度ランダムな乱数の種として機能するからです。

実はRubyでは、乱数の種を省略した場合自分で現在時刻を使って乱数の種を設定しなくても自動的に、現在の時刻、プロセスID、srandを呼び出した回数などを参考にランダムな乱数の種を作成してくれます。

なので、ランダムな乱数の種を作成する場合には乱数の種を省略してOKです。

ランダムな数字の生成

では実際にランダムな数値を作成してきましょう。

まずはKernel#randからです。
乱数の種は省略して書きます。

[実行結果]

このように、整数値10を与えた場合は0〜9の数字がランダムに返されます。
Kernel#randのFloatですが、4.8は4として扱われます。

というのも、Floatは少数部分は省いた後、その数の絶対値として扱われるからです。

なので例えば、rand(-3.234234)はrand(3)で、rand(-23.1234141)はrand(23)と同じです。

またrandでは範囲オブジェクトを渡すことができます。

範囲オブジェクトを使えば、Floatも扱うことができます。

[実行結果]

ここで1つ気をつけなければならないのは、範囲オブジェクトでドットが2つの演算子(..)を使用した場合は最大値を含むという点です。
(ドットが3つ…の場合最大値を含まない)

さきほどはrand(10)とすると0〜9の数値でしたが,rand(1..10)は1〜10までの数値を返します。
混同しやすい点なので、覚えておきましょう。

次はRandom#randの場合です。

[実行結果]

さきほどのKernel#randと比べてみてみると、一目瞭然です。
そうです、Floatをしっかりと解釈していますね。

Random#randの場合はrandom.rand(4.8)のように引数を与えるだけで0.0〜4.8までの数値を返してくれます。

同様に範囲オブジェクトも使用可能です。

[実行結果]

Kernel#randの場合と同じ結果になります。

ここでは範囲オブジェクトを使って乱数を作成しましたが、範囲オブジェクトについて理解が浅いと感じている方はこちらを参考にしてください。

【Ruby入門】範囲オブジェクト(Range)の使い方を理解しよう!
更新日 : 2019年5月22日

ランダム(random)の応用的な使い方

ここではrandomの応用的な使い方として、

  • ランダムな文字列の生成
  • ランダムにarrayをシャッフル
  • ランダムに配列の要素を取り出す
  • ユニークな数値を作成する

などについて紹介します!

ランダムな文字列の生成

sentence_ruby_random

次にランダムな文字列の生成を行っていきましょう。
ランダムな文字列の生成をするためのメソッドはRubyには装備されていないので、自分で書く必要があります。

例えばAからZまでのランダムな文字列を表示させようと思うと以下のようになります。

[実行結果]

このように文字列を生成できていることがわかります!

ランダムにarrayをシャッフル

randを利用してarrayのシャッフルを行うこともできます。

[実行結果]

このようにsort_byメソッドの引数にrandを渡すことによって、ランダムに並び替えを行うことができます。

ランダムに配列の要素を取り出す

乱数を使えば、配列の中からランダムに1つ取り出すことも簡単にできます。

[実行結果]

このようにrandをindexとして指定するだけです。

securerandomを使って、ユニークな数値を作成する

securerandomというライブラリを使えば、ユニーク(重複しない)数値を簡単に作成できます。

[実行結果]

16進数、uuid(Universally Unique IDentifier)、base64など生成できる数値は豊富です。

まとめ

今回はrubyで乱数を生成する方法について、

・Rubyにおけるランダム(random)
・乱数の種を設定する
・ランダムな数字の生成
・ランダムな文字列の生成
・ランダムにarrayをシャッフル
・ランダムに配列の要素を取り出す
・securerandomを使って、ユニークな数値を作成する

などについて解説していきました。

rubyはrandomで数字しか生成ができませんが、使い方によって色々な用途に使えることがわかっていただけたと思います。

乱数の生成は様々な部分で出てくるので、しっかりと確認するようにしましょう!

経験豊富なエンジニアに相談したいあなたへ

「IT業界の実情についてエンジニアの生の声を聞きたい、既にIT業務の仕事をしていて解決したい課題があるから相談にのってもらいたい」そんな要望はございませんか?

周りにエンジニアをやっている人がいないと、実際の現場のことがイメージできず不安ですよね。

侍エンジニア塾の無料体験レッスンでは、ご質問内容によって「現役エンジニア」があなたの開発したいサービスへ技術的なアドバイスや、未経験から内定を獲得する転職活動の極意をお伝えいたします。

下記の無料体験レッスン予約カレンダーよりお申し込みいただけます。あなたのご相談を心よりお待ちしております。

LINEで送る
Pocket

書いた人

長瀬来

長瀬来

Unityを使ったiOSアプリのリリース、フリマサイト運営の経験があります。

経験した言語はC、C#、Javascript、R、Python、Ruby、PHPなど

言語が好きで、英語や中国、ドイツ語を勉強しました。
将来的には海外で生活したいです。

現在はRuby on Rails5やCocos2dxの勉強を主にしています。

ライターとしては
できるだけ初心者にわかりやすい文章になるように心がけています。

趣味は語学、読書です。

おすすめコンテンツ

あなたにぴったりなプログラミング学習プランを無料で診断!

プログラミング学習の効率を劇的に上げる学習メソッドを解説