宮水の日記

宮水の日記

主に書評や資格取得について記事を書いています。

seedrandom【JSライブラリ】

JSライブラリを1日1つ紹介する

1日1つJSのライブラリを調べます。

① ライブラリに関するドキュメントを最初から最後まで読む
② 実際に使ってみる or 使い方を調べる
③ ライブラリを3行で説明する


本日は、seedrandomのドキュメントを読んで実際に業務で使っているところを調べました。

ドキュメント

今回読んだドキュメントはこちらです。

GitHub - davidbau/seedrandom: seeded random number generator for Javascript

Philosophy、Motivation、Back Story

なし

実際に使ってみる

npmでインストールして、console.logで表示してみます!

var seedrandom = require('seedrandom');
var rng = seedrandom('hello.');
console.log(rng());                  // Always 0.9282578795792454

// Global PRNG: set Math.random.
seedrandom('hello.', { global: true });
console.log(Math.random());          // Always 0.9282578795792454

// Autoseeded ARC4-based PRNG.
rng = seedrandom();
console.log(rng());                  // Reasonably unpredictable.

// Mixing accumulated entropy.
rng = seedrandom('added entropy.', { entropy: true });
console.log(rng());                  // As unpredictable as added entropy.

// Using alternate algorithms, as listed above.
var rng2 = seedrandom.xor4096('hello.')
console.log(rng2());

f:id:kattyan53:20200217073859p:plain

seedrandomは、ランダムな文字列や数値を出してくれるライブラリのようです。
JavaScript標準でも乱数が出せる関数がありますが、どうしてわざわざこのようなライブラリを...?

...
Browsers do not provide a built-in way to seed Math.random(), so this solution is handy both when you need a repeatable pseudorandom sequence that is completely predictable, and when you need a robust seed that is much more unpredictable than your browser's built-in random number generator.
...

davidbau.com Random Seeds, Coded Hints, and Quintillions

これは2010年に書かれたものですが、当時は(今も?)ブラウザで乱数のシード値が扱えなかったんですね。

そのため、このライブラリは、予測できて何度も同じ値を生成できる擬似乱数シーケンスが必要な場合や、ブラウザーの組み込み乱数ジェネレーターよりもはるかに予測不能な堅牢なシードが必要な場合な場合に使うと便利、だそうです。

乱数を生成しているのに、どうして同じ値を生成したいのかわからなかったのですが、シード値については、この記事がわかりやすかったです。
JavaScriptで再現性のある乱数を生成する + 指定した範囲の乱数を生成する

弊社では、このseedrandomを質問の順番をランダムにするのに使用していました!
なるほど〜
 

3行でまとめる

seedrandomを導入すると、

  • 乱数のシード値が使えるようになる
  • JS標準の関数より強い乱数が生成できる

以上です!