(実用性は)ないです。
記事の本文及びソースコードに誤りがある場合があります。
誤りなどがあればコメントで教えてください。
どうも
Qiitaではおそらく初投稿だと思います。
普段はnoteやGitHubで活動しています。
今回のお話
ふとした思いつきからの試みです。
JavaScriptやだいたいの言語で乱数を生成するとき、初期テーブルのままの場合、 0~1 の乱数を返しますよね。
Math.random()
でも、これは 0以上1以下 ではなく 0以上1未満 の乱数しか返さないんです。
今回実現したいのは 浮動小数点数も扱える0以上1以下の乱数を出力する関数 です!
実装してみる
条件
- ある程度すべての値が出る確率が等しいこと。
- 処理が速いこと。
- 他の関数などにも応用が効くこと。
v1
コード
randoms/v1.js
function random() {
let result = Math.random();
if (Math.random() == 0) result = 1;
return result;
}
module.exports = random;
説明
resultに仮で返す予定の乱数を生成し置く。
もう一方の乱数で0が出た場合はresultを1に置き換える。
メリット
- 構造がシンプル。
- 処理が速い。
デメリット
- 1が出る確率がほんの少しだけ高い。
v2
コード
randoms/v2.js
function random() {
let result;
do {
result = Math.random() + Math.random();
} while (result > 1);
return result;
}
module.exports = random;
説明
2つの乱数を生成した後足す動作を1よりも大きくならない値が出るまで続ける。
メリット
- 確率が等しい。
デメリット
- 処理速度に差が出やすい。
まとめ
まだまだ他の方法がありそう。
当分はv2を利用するのが安牌だと思う。
これを利用して作ったnpmパッケージ