プログラミングで乱数を取得する方法を言語別にまとめてみた

プログラミング

プログラミングの学習していると乱数(ランダム値)を取得したい場面が出てきます。

例えばじゃんけんやサイコロを扱う時などに、○~○の間のランダム値が必要となるケースです。

ところが乱数の取得方法は、普段はそんなに使うことがないからか、あまり覚えていないんですよね。
僕はいつも調べながら書いていたります。

そこで本記事では、言語別に乱数の取得方法をまとめてみました。

今回対象とした言語は、JavaScript、Python、Ruby、Java、Goです。

僕自身のメモのようなものですが、参考になれば幸いです。

乱数のシード

乱数を取得するプログラムの前に、乱数のシードについてまとめておきます。

一般的にプログラムで取得する乱数は、擬似乱数と呼ばれ、完全にランダムな値を取得できるようにはなっていません。

そのため、何回も乱数を取得すると同じ値が取得されたりします。

乱数を発生させるためのアルゴリズムは言語により異なりますが、発生させるための種(シード)を変化させることで、異なる値を取得できるようになります。

なお、今回紹介する方法は、一般的に扱う乱数値の取得方法であり、暗号に使うような乱数の取得には向かない方法となりますので、ご注意いただければと思います。

言語別乱数取得プログラム

今回はサイコロを例題として、1~6の乱数を取得するプログラムを作ってみます。

JavaScript

num = Math.floor(Math.random() * 6) + 1;
console.log(num);

JavaScriptは、標準で提供されているMath.random()を利用することで、0以上、1未満の範囲で浮動小数点の乱数を取得できます。

利用者がシードの設定はできないようになっています。

Python

import random

num = random.randint(1, 6)
print(num)

Pythonは、標準で提供されているrandomモジュールをimportして利用します。

一般的に乱数を取得するには、random()関数を使いますが、こちらは0.0以上1.0未満の浮動小数点の乱数を取得できます。

それ以外に、任意の範囲の整数を取得するためのrandint()などが用意されています。

なお、Pythonのrandomモジュールには、seed()関数で、利用者がシードを設定することができます。デフォルトは現在のシステム時刻が使用されます。

Ruby

num = rand(1..6)
puts num

Rubyは、標準で提供されているrand()メソッドを利用します。

一般的な乱数を取得するには、rand()メソッドを引数なしで使います。こちらは0.0以上1.0未満の実数を取得できます。

rand()メソッドの引数に、様々な形式を指定することで任意の範囲の整数や実数を取得できるようになります。

なお、Rubyも、srand()メソッドにより、シードを利用者が設定することができます。デフォルトは現在時刻やプロセスIDなどを元に種を作ります。

Java

import java.util.Random;

public class RandomJava {
    public static void main(String[] args) {
        Random random = new Random();
        int num = random.nextInt(6) + 1;
        System.out.println(num);
    }
}

Javaは、java.utilパッケージのRandomクラスを利用します。他にjava.lang.Mathクラスのrandom()メソッドを利用する方法もあります。

Randomクラスでは、整数値を取得するnextInt()のほか、nextDouble()やnextBoolean()など取得したい値の型に合わせてメソッドが提供されています。

nextInt()では、引数を指定すると0から指定した値未満(指定した値は含まない)の整数値を取得することができます。

なお、Randomクラスのコンストラクタに引数を指定することで、シードを利用者が設定することができます。

Go

package main
import (
    "fmt"
    "math/rand"
    "time"
)
func main() {
    rand.Seed(time.Now().UnixNano())
    num := rand.Intn(6) + 1
    fmt.Println(num)
}

Goは、math/randパッケージを利用します。

他の言語と異なる注意点として、seedがデフォルトが1で固定されているため、明示的に設定しないといつも同じ値が取得されてしまうということです。

Intn()は、0から指定した値未満(指定した値は含まない)の整数値を取得することができます。

サイコロの乱数取得のまとめ

言語 乱数取得 注意点
JavaScript Math.floor(Math.random() * 6) + 1; シードの設定は基本的にできない
Python random.randint(1, 6)
Ruby rand(1..6)
Java random.nextInt(6) + 1;
Go rand.Intn(6) + 1 シードの設定をしないと毎回同じ値になる

まとめてみると、PythonとRubyはやはり簡単にプログラミングできるようになっていますね。

今回は、プログラミングで乱数を取得する方法を言語別にまとめてみました。

何かの参考になれば幸いです。

コメント

タイトルとURLをコピーしました