36 進数表記に変換することによるランダムな文字列生成は偏りが大きいよという話。なるほど。というわけで JavaScript の場合を調べてみた。といっても統計学的な検証とかよくわからないのでざっと見た感じで。
Math.random().toString(36)
[LINK]Math.floor(Number.MAX_VALUE * Math.random()).toString(36)
[LINK]Firefox での偏りが相対的に小さいのは、SpiderMonkey では Bigint という独自の構造体を用いて n 進数表記に変換してるからみたいだ。一方 JavaScriptCore では double 型と fmod を用いて変換を行っている。
その違いがどうしてこのような結果をもたらすかについては教えてエロい人だが、とりあえず一様性を求めるなら Math.random().toString(36).substring(2, 10)
などとしたほうがいいようだ。
セコメントをする