簡體   English   中英

JavaScript中的Math.random和Web編程

[英]Math.random and web programming in JavaScript

根據此Stack Overflow線程 ,JavaScript中的Math.random()取決於瀏覽器或操作系統。 基本上,這意味着JavaScript沒有用於生成統一隨機變量的標准算法。 該線索似乎表明Chrome的統一隨機數算法特別糟糕。

在我的程序中,我嘗試根據一些信息以及隨機噪聲來了解用戶的行為。 我對Math.random()生成的數字使用Box-Muller變換來生成高斯隨機數。 這是否意味着使用一種瀏覽器的用戶將遭受與其他瀏覽器不同類型的噪聲? 請注意,我使用Box Muller是因為我並不關心速度,但是我知道它對偽隨機數的生成方式特別敏感。 關於Math.random()為何不好的問題似乎有很多話題,但是關於實際使用的內容卻沒有太多話題。 最佳做法是什么? 因為我正在使用Box-Muller轉換成高斯數,所以我應該特別注意些什么嗎?

http://en.wikipedia.org/wiki/Xorshift上有一個基於xor-shift的RNG,具有良好的隨機性,應該可以很容易地移植到JavaScript:

編輯完成:

(function () {
    var x = 123456789;
    var y = 362436069;
    var z = 521288629;
    var w = 88675123;
    var f = Math.pow(2, -32);

    Object.defineProperty(Math, 'xor128', {
        value: function () {
            var t = x ^ (x << 11);
            x = y;
            y = z;
            z = w;
            w = w ^ (w >>> 19) ^ (t ^ (t >>> 8));

            return (w >>> 0) * f;  // convert to floating point          
        }
    });

})();

注意:這僅使用生成的128位中的32位來產生浮點結果。 從理論上講,您可以將其他狀態變量之一的另外20位組合起來以產生52位結果。

我看到的最重要的問題是它不支持播種-它將始終生成相同的序列。

Box-Muller變換僅適用於均勻分布的輸入。 根據MDN (最后一個示例), Math.random()將不會生成均勻分布的數字。

ECMAScript規范Math.random()了以下說明:

使用依賴於實現的算法或策略,返回一個正號的Number值,該值大於或等於0但小於1,在該范圍內隨機選擇或偽隨機選擇,並且在該范圍內具有近似均勻的分布。 此函數不帶參數。

因此,這取決於瀏覽器。 瀏覽器可能但不必實現完全均勻分布的隨機數生成器。

因此,您無法使用Math.random()在瀏覽器端的Javascript中可靠地實現跨瀏覽器的Box-Muller轉換。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM