균일 분포, 정규 분포, 지수 분포 및 포아송 분포의 난수를 생성하는 방법 (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;
}
}
이상.
Reference
이 문제에 관하여(균일 분포, 정규 분포, 지수 분포 및 포아송 분포의 난수를 생성하는 방법 (Scala)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/suzuki-navi/items/1609cfaefb5b4c16133e
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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;
}
}
이상.
Reference
이 문제에 관하여(균일 분포, 정규 분포, 지수 분포 및 포아송 분포의 난수를 생성하는 방법 (Scala)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/suzuki-navi/items/1609cfaefb5b4c16133e
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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
가 필요합니다. 포아송 분포의 난수는 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;
}
}
이상.
Reference
이 문제에 관하여(균일 분포, 정규 분포, 지수 분포 및 포아송 분포의 난수를 생성하는 방법 (Scala)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/suzuki-navi/items/1609cfaefb5b4c16133e텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)