0
0

1を出力する場合がある乱数を作りたい話

Last updated at Posted at 2024-08-29

(実用性は)ないです。
記事の本文及びソースコードに誤りがある場合があります。
誤りなどがあればコメントで教えてください。

どうも
Qiitaではおそらく初投稿だと思います。
普段はnoteGitHubで活動しています。

今回のお話

ふとした思いつきからの試みです。
JavaScriptやだいたいの言語で乱数を生成するとき、初期テーブルのままの場合、 0~1 の乱数を返しますよね。

Math.random()

でも、これは 0以上1以下 ではなく 0以上1未満 の乱数しか返さないんです。

今回実現したいのは 浮動小数点数も扱える0以上1以下の乱数を出力する関数 です!

実装してみる

条件

  1. ある程度すべての値が出る確率が等しいこと。
  2. 処理が速いこと。
  3. 他の関数などにも応用が効くこと。

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パッケージ

0
0
4

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