【Ruby入門】乱数(Random)などの数値計算用クラスや端数処理
  • facebookページ
  • twitterページ
  • 2017.10.23

    【Ruby入門】乱数(Random)などの数値計算用クラスや端数処理

    Rubyにて数値計算をするうえで、複雑な計算をすることがあります。乱数の発生、平方根、sinやcosなどの三角関数・・・などなど。

    Rubyではそれらを実装するためのクラスが提供されており、私たちはそれらのおかげで簡単に複雑な計算ができます。

    数値計算といえば科学技術っぽく聞こえますが、もっと身近な例でいうと、金額計算も数値計算です。金額計算はお金の計算である以上、誤差や計算誤りは絶対に許されません。

    では、Rubyではそのような厳密な計算はどうするのでしょうか?

    本記事では、Randomクラスをはじめとした様々なクラス、端数処理、Ruby独特の分数計算を解説します。

    Rubyの各種クラス、モジュール

    様々なクラスが用意されていますが、まずは冒頭でふれた乱数(Ramdomクラス)から解説します。

    Rubyの乱数クラス Random

    乱数とは、何ら規則性がなく一定の範囲で均一に出る数値のことです。もう少しいうと、都度異なる数値かつ偏っていない(特定の数値ばかり出る確率が高いというのはダメ)数値のことです。

    例えば「1から100までの範囲で乱数を発生させる」という場合です。

    これを先ほどの解説に当てはめてみると「1つの値を連続して何度も取り出す。ただし、1から100までの間で、規則性がなく、確率的に偏りがないこと」となります。

    これをRubyで実装するには、Randomクラスを使います。

    [実行結果]

    ※連続して何度も実行しています。

    randメソッドの引数に100を与えたので、0から100より小さな整数がランダムに発生しました。引数を与えない場合は、ゼロから1より小さい値が返ります

    Mathモジュール

    三角関数や平方根など、数値計算でよく使うものはMathモジュールにて提供されています。

    [実行結果]

    結果の1行目は、100の平方根である10が返りました。2行目は、sin90度の1.0が返ってきました。

    Mathモジュールには定数も提供されています。Math::PIで円周率πが得られます。それを1/2したからsin90度となったわけです。

    Mathモジュールのより詳しい解説は、こちらをごらんください。

    Rubyにおいても悩ましい端数処理

    どの開発言語でも、端数処理は悩ましい問題です。

    例えば、3,300円に消費税を加算した金額を計算しましょう。

    [実行結果]

    「消費税計算は端数切り上げ」というルールがあると、ceilを使って以下の結果を出せます。

    [実行結果]

    目的とする3564円より1円多く出ました!?金額計算でそれは致命的です。

    Rubyでは、BigDecimalを使い以下のように対処します。

    [実行結果]

    今度は正しく計算できました!

    でも、なぜBigDecimalに文字列で値を渡さなければいけないのでしょうか?

    では試しに普通に数値で渡しましょう。

    どこでエラーになったのか分かるように、先ほどの計算をバラして試しましょう。

    [実行結果]

    3行目で引数エラーがかかりました。

    エラーメッセージを見ると、1.08と書いたとたんにFloat型のオブジェクトが生成されてしまい、それをBigDecimalに渡すと精度が落ちるということでした。

    Rubyでの分数の計算 Rational

    Rubyには、分数計算をするメソッドがあります。正確にいうと、有理数の計算を行うメソッドです。

    有理数とは、分数で表せることができる数のことです。平方根や虚数などは、分数の形で表せないので無理数といいます。

    ところで、以下の計算をしてみましょう。0.6と0.7を足すと1.3になりますので、trueが返るはずです。

    [実行結果]

    こんな超単純な計算ですら正しい結果が出ないのは、Rubyのせいでしょうか?決してそうではなく、ここには浮動小数点に関する重要なテーマがあります。

    かなり大事なことなので、じっくりと解説します。

    人間の世界では、0.1は1/10、0.3は3/10と表せます。しかし浮動小数点は1/2、1/4、1/8・・・と2のべき乗の逆数で表現します。

    0.5は1/2、0.25は1/4、0.75は1/2 + 1/4・・・と表現できるので問題ありません。では0.3はどうでしょうか?これは2のべき乗の逆数では表現できません。

    がんばって0.3を2のべき乗で表現するとすると小数点以下が延々と続き、どこかで計算を打ち切らないといけません。

    ここが誤差となって現れるわけです。これを丸め誤差といいます。

    これに対処するにはどうすれば良いか、その解決策の1つとしてRationalを使う方法があります。

    要は分母が2ではなく10であれば問題ありません。その考えをプログラムに載せましょう。

    [実行結果]

    今度は正しく計算できました!

    念のためBigDecimalを使って同じことをしてみます。

    [実行結果]

    BigDecimalでも正しく計算できました!

    まとめ

    本記事では、クラスを使った数値計算や端数処理を解説しました。

    本記事の内容を自分で何度も試して、効率的かつ正確な数値計算ができるようになってくださいね!


    ポテパンが提供するサービスについて

    本メディア「ポテパンスタイル」を運営する株式会社ポテパンは、エンジニアキャリア領域で複数サービスを提供しています。

    ポテパンフリーランス

    ポテパンフリーランス

    フリーランスエンジニアの方に高単価案件をご紹介しております。弊社ではフリーランス案件を常時300件ほど保有しており、その中からあなたに適した案件をご案内いたします。また、これから独立してフリーランスになる方の無料個別相談も承っております。フリーランスになった後の案件獲得方法やお金面(税金や保険など)についてお答えいたします!

    ポテパンキャリア

    ポテパンキャリア

    エンジニア職専門の転職エージェントです。ポテパンキャリアでは、技術のわかるエージェントがあなたの転職をサポートします。エージェント自身がエンジニアなので、あなたと同じ目線で仕事内容や今後のキャリアについて一緒に考えることができます。

    ポテパンキャンプ

    ポテパンキャンプ

    ポテパンキャンプでは、RubyにてゼロからオリジナルのECサイトを作り上げてる3ヶ月間の実践型カリキュラムを提供しております。すでに本スクールの卒業生は、エンジニア職として様々な企業様に就職しております。なお、本スクールは受講料10万円と他社スクールに比べ格安となっており、またポテパンからご紹介させていただいた企業へ就職が決まった場合は、全額キャッシュバックいたします。



    株式会社ポテパンは、企業とエンジニアの最適なマッチングを追求しています。気になるサービスがあれば、ぜひ覗いてみてください!

    ポテキャンバナー ポテキャリバナー

    この記事をシェア

    • Facebookシェア
    • Twitterシェア
    • Hatenaシェア
    • Lineシェア

    関連ワード

    pickup









    ABOUT US

    ポテパンはエンジニアと企業の最適なマッチングを追求する企業です。

    READ MORE