これおもしろい

なにはともあれ1日1記事、いや、週1記事

アルゴリズム事典より: Weibull分布

[改訂新版]C言語による標準アルゴリズム事典 (Software Technology)

[改訂新版]C言語による標準アルゴリズム事典 (Software Technology)

C言語による最新アルゴリズム事典という本が1991年に発売されていたのをご存じですか?
専門学校時代に手元にあると良いよと言われ、持ってはいたものの、あまり開いたことがありませんでした。
今日なんとなく開き、アルゴリズムを学びつつ、Kotlinで書いたらどう書くかというのをブログに書くのも面白いのではと思い、やってみました。

改訂新版を先ほど購入したので、内容自体は改訂新版を元にしています。

Weibull分布

p.429

概要

f:id:takattata:20181005225205j:plain
f:id:takattata:20181005225215j:plain

結論: 理屈分かってないけど、そういう分布の乱数の作り方ということは分かった

コード読解

本を元にC++にしたもの

#include <iostream>
#include <cmath>

using namespace std;

double randWeibull(double alpha) {
    double randomValue = rand() / (double)RAND_MAX;
    return pow(-log(1-randomValue), 1/alpha);
}

int main() {
    cout << randWeibull(0.2);
    return 0;
}

https://www.onlinegdb.com/online_c++_compiler

コードのrandomValueが、F(x)のxのところで、購入randomValueヶ月以内に当たる
alpha〜故障型を決めるパラメータ

引数がalphaだから、
randWeibull関数任意の故障型の購入経過月数の一様分布(=randomValue)において最初に故障する確率が求められる
という認識で合っているのだろうか🤔

Kotlinで書く

Kotlin v1.3-RC

import kotlin.math.*
import kotlin.random.*

fun randWeibull(alpha: Double): Double {
    val randomValue = Random(10).nextDouble(1.0)
    return -ln(1-randomValue).pow(1/alpha)
}

fun main(args: Array<String>) {
    print(randWeibull(1.3))
}

https://try.kotlinlang.org/

Random

github.com

Kotlin 1.3でRandomクラスが出来る予定だそう
Javaと似たものらしい
最初にseedとなる値(コードでは10の定数)を渡して実体を生成してから使う
next〜関数の引数が範囲の上限(bound)で、0〜boundを除いた値の間の乱数が返される

(ミリ秒でも渡せないかと思ったが、Kotlinだけでの時間の取得方法が分からなかったので、ひとまず定数を渡した)

ln関数

ln - Kotlin Programming Language

自然対数(log e)を使う時はlog関数でなくln関数を使う
the natural logarithmより来ていると思われる

pow関数

pow - Kotlin Programming Language

Double, Floatから生えている、べき乗を返す関数

感想

分布の乱数、全然馴染みなかったけど、多少理解出来た気はする。
数式は全然分からないけど、こういうコードを書いたらこの数式と同じ意味になるのか、というのが分かるの面白い。これは面白い題材を見つけた気がする。
アルゴリズムかなり苦手なので、強化も兼ねて続けようと思いました。

認識違いあったらそっとコメントください🙏

参考文献

一様分布の平均,分散,特性関数など | 高校数学の美しい物語
C言語による乱数生成
ガンマ関数 - Wikipedia
数学記号exp,ln,lgの意味 | 高校数学の美しい物語