WebKit Bugzilla
New
Browse
Log In
×
Sign in with GitHub
or
Remember my login
Create Account
·
Forgot Password
Forgotten password account recovery
RESOLVED FIXED
Bug 157805
REGRESSION(
r192855
): Math.random() always produces the same first 7 decimal points the first two invocations
https://bugs.webkit.org/show_bug.cgi?id=157805
Summary
REGRESSION(r192855): Math.random() always produces the same first 7 decimal p...
Joseph Pecoraro
Reported
2016-05-17 11:48:28 PDT
* SUMMARY Math.random() always produces the same first 7 decimal points the first two invocations * STEPS TO REPRODUCE 1. Inspect about:blank 2. Run Math.random() twice => first 7 decimals are identical * EXAMPLES > Math.random() < 0.39641653952203815 < 0.39641654154667616 > Math.random() < 0.7208129766006761 < 0.7208129575360934 * NOTES Seen in a comment on Hacker News: <
https://news.ycombinator.com/item?id=11711912
>
> 2) Math.random() returns the same result the first two calls on page load.
Attachments
[PATCH] Proposed Fix
(4.60 KB, patch)
2016-05-17 14:47 PDT
,
Joseph Pecoraro
no flags
Details
Formatted Diff
Diff
View All
Add attachment
proposed patch, testcase, etc.
Filip Pizlo
Comment 1
2016-05-17 11:50:06 PDT
Wow, that's hilarious.
Joseph Pecoraro
Comment 2
2016-05-17 12:01:18 PDT
Caused by
r192855
: <
http://trac.webkit.org/changeset/192855
>
Geoffrey Garen
Comment 3
2016-05-17 12:01:46 PDT
Probably too many zeroes in the initial seed, since our seed API is 32 bit. You can probably fix this by: uint64_t seed64 = seed; m_low = (seed64 << 32) | seed64; m_high = (seed64 << 32) | seed64; Or you could update the seed API to be 128bit.
Radar WebKit Bug Importer
Comment 4
2016-05-17 12:21:48 PDT
<
rdar://problem/26327851
>
Joseph Pecoraro
Comment 5
2016-05-17 13:33:10 PDT
(In reply to
comment #3
)
> Probably too many zeroes in the initial seed, since our seed API is 32 bit. > You can probably fix this by: > > uint64_t seed64 = seed; > m_low = (seed64 << 32) | seed64; > m_high = (seed64 << 32) | seed64; >
After this the first 4 digits stayed nearly identical: >>> Math.random() 0.41647092963078913 >>> Math.random() 0.41646612834590113 >>> Math.random() 0.47840231815551537 >>> Math.random() 0.47839187513838377 How about we just advance once after setting the seed? m_low = seed; m_high = seed; advance(); Do you see any disadvantages to this?
Geoffrey Garen
Comment 6
2016-05-17 14:29:59 PDT
> How about we just advance once after setting the seed? > > m_low = seed; > m_high = seed; > advance(); > > Do you see any disadvantages to this?
LOL. Brain fart. It's guaranteed that no better solution is possible. We have 128 bits of state that we want to set based on 32 bits of input. All solutions to this problem include some kind of bias unless they are... random!
Joseph Pecoraro
Comment 7
2016-05-17 14:47:44 PDT
Created
attachment 279167
[details]
[PATCH] Proposed Fix
Joseph Pecoraro
Comment 8
2016-05-17 14:48:51 PDT
An alternative test approach could be TestWebKitAPI creating a WeakRandom, or a jsc API that allows setting the random seed. But this tests Math.random which is web exposed so probably the safest.
Geoffrey Garen
Comment 9
2016-05-17 15:29:31 PDT
Comment on
attachment 279167
[details]
[PATCH] Proposed Fix EWS failure seems spurious.
WebKit Commit Bot
Comment 10
2016-05-17 15:51:49 PDT
Comment on
attachment 279167
[details]
[PATCH] Proposed Fix Clearing flags on attachment: 279167 Committed
r201053
: <
http://trac.webkit.org/changeset/201053
>
WebKit Commit Bot
Comment 11
2016-05-17 15:51:57 PDT
All reviewed patches have been landed. Closing bug.
Note
You need to
log in
before you can comment on or make changes to this bug.
Top of Page
Format For Printing
XML
Clone This Bug