균일 분포, 정규 분포, 지수 분포 및 포아송 분포의 난수를 생성하는 방법 (Scala)

9846 단어 Scala난수
난수를 생성하는 샘플 코드입니다. 균일 분포의 난수에서 특정 분포를 따르는 난수를 생성하는 방법의 메모입니다.

샘플 코드의 언어는 Scala입니다.

균일 분포



균일 분포의 난수를 생성한다 Random 클래스를 그대로 사용합니다.
import scala.util.Random;

// 0からwidthまでの一様な分布の乱数
def randomUniform(width: Double, size: Int): IndexedSeq[Double] = (0 until size).map { _ =>
  width * Random.nextDouble();
}

정규 분포



정규 분포의 난수를 균일 분포의 난수로부터 생성합니다. 2개씩 생성할 수 있으므로, 루프의 횟수를 반으로 하고 있습니다.
import scala.util.Random;

// 平均mu、標準偏差sigmaの正規分布に従う乱数
def randomNormal(mu: Double, sigma: Double, size: Int): IndexedSeq[Double] = {
  val pi2 = 2 * Math.PI;
  (0 until (size + 1) / 2).flatMap { _ =>
    val rnd_a = Random.nextDouble();
    val rnd_b = Random.nextDouble();
    val rnd_a2 = Math.sqrt(-2 * Math.log(rnd_a));
    val rnd_b2 = pi2 * rnd_b;
    val random_1 = mu + sigma * rnd_a2 * Math.sin(rnd_b2);
    val random_2 = mu + sigma * rnd_a2 * Math.cos(rnd_b2);
    List(random_1, random_2);
  }.take(size);
}

2개의 0~1의 난수로부터 2개의 정규 분포의 난수를 생성하는 식입니다.
\begin{align}
r_1 =& \sqrt{-2\log{a}} \sin{2\pi b} \\
r_2 =& \sqrt{-2\log{a}} \cos{2\pi b} \\
\end{align}

1000개 만들 때의 히스토그램.



※Scala이면, Random.nextGaussian() 라고 하는 메소드를 사용할 수 있습니다. 이 기사는 균일 분포에서 다른 분포를 생성하는 방법입니다.

지수 분포



지수 분포의 난수를 균일 분포의 난수로부터 생성합니다. 파라미터로서 lambda 가 필요합니다.
import scala.util.Random;

// 平均1.0/lambdaの指数分布に従う乱数
def randomExponential(lambda: Double, size: Int): IndexedSeq[Double] = {
  val lambda1 = -1.0 / lambda;
  (0 until size).map { _ =>
    val x = Random.nextDouble();
    lambda1 * Math.log(x);
  }
}
lambda=1.0 에서 1000개 만들 때의 히스토그램.



포아송 분포



포아송 분포의 난수를 균일 분포의 난수로부터 생성합니다. 파라미터로서 lambda 가 필요합니다. 포아송 분포의 난수는 0 이상의 정수입니다.
import scala.util.Random;

// 平均lambdaのポアソン分布に従う乱数
def randomPoisson(lambda: Double, size: Int): IndexedSeq[Int] = {
  val exp_lambda1 = Math.exp(-lambda);
  (0 until size).map { _ =>
    var r: Int = 0;
    var d: Double = Random.nextDouble();
    while (d >= exp_lambda1) {
      val x = Random.nextDouble();
      d = d * x;
      r = r + 1;
    }
    r;
  }
}

이상.

좋은 웹페이지 즐겨찾기