LoginSignup
1
0

More than 5 years have passed since last update.

いろんな言語で乱数取得

Last updated at Posted at 2019-05-04

以前、現在時刻の取得方法についてまとめたが、乱数を取得することも多いと感じたので、擬似乱数として0以上10未満の整数を取得する方法まとめることにした。なお、乱数生成のアルゴリズムについては奥が深いため、ここで紹介する方法は品質にはこだわらず、あくまで「手軽に乱数を作るならこうする」というお決まり的な自分用メモなのであしからず。

C言語

はじめはC言語。というのも、C言語で乱数を取得する方法を理解すれば、だいたいどの言語でも「この手順が必要になる」という大枠をつかむことができるから。

rand()関数を利用すると0以上RAND_MAX以下の整数を取得できる。ただし意図的にsrand()関数で乱数のシードを設定しなければ、シードとして1が仮定されるため、実行の都度同じ乱数が生成されてしまう。これを避けるためによく使われる手段が、現在時刻をシードとして設定すること。

  1. 現在時刻(経過秒数)を取得する
  2. srand()関数で現在時刻をシードに設定する
  3. rand()関数で乱数を取得する
  4. 取得した乱数を剰余などで算術演算して必要とする範囲に収める
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

/**
 * min以上max未満の整数をランダムに取得する
 */
int getRandomInt(int min, int max){
    return rand() % (max - min) + min;
}

int main(void){
    srand((unsigned)time(NULL));//経過秒数でシードを設定する
    printf("%d\n", getRandomInt(0, 10));
    return 0;
}

Java

Javaはjava.util.Randomクラスがあるため、これを使うのが簡単。

  1. java.util.Randomクラスのインスタンスを生成する
  2. nextInt()メソッドで乱数を取得する
import java.util.Random;
public class Sample{
  public static void main(String[] args){
    Random r = new Random();//引数にシードを設定することも可。省略するとSystem.nanoTimeに応じて決定される値が仮定される
    System.out.println(r.nextInt(10));//0以上10未満の整数を取得
  }
}

なお、java.lang.Mathクラスにrandom()メソッドがあるため、これを使う方法もあるが、実装例はJavaScriptと似ているため割愛。

C#

Javaとほぼ同じ。System.Randomクラスを利用するのが簡単。

using System;
namespace Sample{
    class Program{
        static void Main(string[] args){
            Random r = new Random();//引数にシードを設定することも可。省略するとEnvironment.TickCountに応じて決定される値が仮定される
            Console.WriteLine(r.Next(10));//0以上10未満の整数を取得
        }
    }
}

JavaScript(TypeScript)

JavaScriptの場合はMath.random()を利用する。ただし、この関数は

  • 0.0以上1.0未満の小数を返却する
  • シードを設定できない
/**
 * min以上max未満の整数をランダムに取得する
 */
function getRandomInt(min: number, max: number): number {
    min = Math.ceil(min);   //その数以上の最小の整数にする。1.23 → 2
    max = Math.floor(max);  //その数以下の最大の整数にする。1.23 → 1
    return Math.floor(Math.random() * (max - min)) + min;
}

golang

GoではMath/randパッケージのを利用する。シードはrand.Seed()で設定するが、デフォルトは1が仮定されているため、C言語同様、意図的に現在時刻などで設定するのが一般的。C言語と違い、Intn()を使えば、剰余を取る必要はない。

package main
import (
    "fmt"
    "math/rand"
    "time"
)
func main(){
    rand.Seed(time.Now().UnixNano()) //経過秒数をシードに設定
    fmt.Println(rand.Intn(10)) // 0以上10未満の整数を取得
}

Ruby

Randomクラスを利用するのが簡単。rand()に指定する値がIntFloat1..10などの範囲指定かで動きが変わるので注意。
C言語みたいにsrand()でシードを設定することもできる。

r = Random.new()  # 引数にシードを設定する。省略するとRandom.new_seedが仮定される
puts r.rand(10)   # 0以上10未満の整数を取得
puts r.rand(10.0) # 0.0以上10.0未満の小数を取得

Python

randomモジュールを使うのが簡単だが、random.randrange()未満random.randint()以下と地味に使い間違えやすい関数が並んでいるので注意すること。
シードを設定する場合は、意図的にrandom.seedを設定する。設定しない場合はシステム時刻が仮定される。詳細は参考サイト参照。

import random
print(random.randrange(0, 10))  # 0以上10未満の整数を取得
print(random.randint(0, 10))  # 0以上10 以 下 の整数を取得

kotlin

Javaと同じく、Randomクラスを使う。シードを設定したいときはこっちを使う。

import kotlin.random.Random
fun main(args: Array<String>) {
    println(Random.nextInt(10))  //0以上10未満の整数を取得
}

swift

swift4.2からRandom APIが登場したのでこれを使うのが簡単。

print(Int.random(in: 0..<10)) //0以上10未満の整数を取得

シェルスクリプト

bashやzshを使っているならシェル変数$RANDOMに乱数が格納されている。Windowsのbatにも同様に%RANDOM%がある。

echo $RANDOM

SQL

乱数を生成できるSQL関数が用意されているデータベースの場合は、SQLで乱数を取得することもできる。

MySQL

RAND()を使うと0.0以上1.0未満の小数が得られるのでこれを算術演算して必要な範囲に収めればいい。

SELECT FLOOR((RAND() * 10))

PostgreSQL

RANDOM()を使う。MySQLと関数名が違うが同じことなので割愛。

結言

とりあえず、自分が関わったことのある言語について乱数取得方法をまとめてみた。
今後、別の言語でも乱数が必要になることがあれば随時更新する予定。

1
0
0

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
1
0