W3C home > Mailing lists > Public > public-html-ig-zh@w3.org > February 2011

Re: Math.random().toString(radix).substr(2) 的長度問題

From: Kang-Hao (Kenny) Lu <kennyluck@w3.org>
Date: Mon, 14 Feb 2011 05:58:58 +0900
Message-ID: <4D584612.5020302@w3.org>
To: Timothy Chien <timdream@gmail.com>
CC: 中文HTML5同樂會ML <public-html-ig-zh@w3.org>
(11/02/11 13:35), Timothy Chien wrote:
> 最後發現有問題的程式碼是這個:
> var randomString = Math.random().toString(16).substr(2); // substr(2)
> 是把前面的 "0." 拿掉

補一個javascirpt URL(以方便測試):
javascript:alert(Math.random().toString(16).substr(2))  話說,你下次可以
考慮直接送一個HTML的附件來給大家玩。W3C伺服器吃5MB以下的附件,而且就會有
網址。

>
> 在 Webkit,randomString 的長度會在 7 和 8 之間跳,
> Firefox 則是 13 或是 14 .......

對了,你說Webkit是指Chorme/V8嗎?手邊沒有Chrome,無法測試。Safari/Nitro
的情形的確是7至8位。

> [我剪]
>
> 但是還是想要調查為什麼兩個瀏覽器有這麼大的差異。
> 當時我和同事的結論是,
> 雖說 ECMAScript [1] 有規定 Number 型別的數字是  64-bit format IEEE 754
> value,0~1 之間有 2^64 個值 [2],
> 但是 webkit 的假亂數產生器不會用到所有的位數,導致 toString(16) 之後的
> 長度跟 Firefox 不一樣。
> 只是我自己也沒小心,以為 random() 的小數點長度是固定的。

看了John Hax兄講的,我也覺得這可能是toString的問題。如果ECMA沒規定
toString的在radix!=10的情形的話,只能算你倒楣了 xdd

話說,一個規範裡面沒寫(unspecified)真的是最遭的情形,一般來說都是至少
隨便寫一個上去比較好,一般來說實作意願不高的話就用 RFC 2119[1]的"MAY"。

[1] http://tools.ietf.org/html/rfc2119

剛好這幾天Webkit的人最近在WHATWG提一個新的強密碼(cryptographically
strong)的亂數的API[2],而且似乎已經實作完成了[3](Webkit新API的產出量越
來越快了)。拿Nightly試一下如果 toString(16)還是7至8位,那似乎就確定是
toString的問題了。

[2]
http://lists.whatwg.org/pipermail/whatwg-whatwg.org/2011-February/thread.html#30241
[3] https://bugs.webkit.org/show_bug.cgi?id=22049

順道一提,之前提到[4]的windows.btoa跟windows.atob已經進入WHATWG版的
HTML(沒版號版)了[5]。

[4] http://lists.w3.org/Archives/Public/public-html-ig-zh/2011Jan/0059
[5]
http://www.whatwg.org/specs/web-apps/current-work/multipage/webappapis.html#atob
Received on Sunday, 13 February 2011 20:57:56 UTC

This archive was generated by hypermail 2.3.1 : Tuesday, 6 January 2015 20:43:46 UTC