簡體   English   中英

如何在JavaScript中使用Math.random實現隨機性?

[英]How is randomness achieved with Math.random in javascript?

如何在JavaScript中使用Math.random實現隨機性? 我已經做了一些隨機選擇大約50種不同選項的東西。 我想知道使用Math.random來獲得隨機性是多么的舒服。

從規格:

隨機():

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

所以答案是它取決於你使用的JavaScript引擎。

我不確定所有瀏覽器是否使用相同的策略或不幸的策略

這對你的目的應該沒問題。 只有你做了大量的數字才會開始看到一個模式

如果您沒有集中匯集和使用結果,即使用OAuth,則使用Math.random()就可以了。

例如,我們的網站使用Math.random()生成隨機“nonce”字符串以供OAuth使用。 原始JavaScript庫通過使用Math.random()從預定列表中選擇一個字符來完成此操作:即

for (var i = 0; i < length; ++i) {
    var rnum = Math.floor(Math.random() * chars.length);
    result += chars.substring(rnum, rnum+1);
}

問題是,用戶獲得了重復的nonce字符串(即使使用10個字符長度 - 理論上~10 ^ 18個組合),通常在幾秒之內。 我猜這是由於Math.random()從時間戳播種,正如其他提到的海報之一。

確切的實現當然可以根據瀏覽器的不同而有所不同,但它們都使用某種偽隨機數生成器。 雖然它並不是隨機的,但它對於所有一般用途來說肯定是足夠好的。

如果你將它用於需要非常好的隨機性的東西,比如加密或模擬玩游戲中的機會游戲,那么你應該只擔心隨機性,但是你無論如何都很難使用Javascript。

100%隨機足以滿足您的需求 它是按時間播種的,所以每次運行它都會得到不同的結果。

將其粘貼到您的瀏覽器地址欄中...

javascript:alert(Math.random() * 2 > 1);

並按[Enter]幾次......我得到“真,假,假,真” - 隨機足夠:)

這有點矯枉過正......但是,我忍不住這樣做:)

您可以在瀏覽器地址欄中執行此操作。 它會生成0到4之間的隨機數,100000次。 並輸出每個數字生成的次數以及一個隨機數跟隨另一個的次數。

我在Firefox 3.5.2中執行了此操作。 所有數字似乎大致相等 - 表示沒有偏見,並且數字生成方式沒有明顯的模式。

javascript:
var max = 5;
var transitions = new Array(max);
var frequency = new Array(max);
for (var i = 0; i < max; i++)
{
     transitions[i] = new Array(max);
}
var old = 0, curr = 0;
for (var i = 0; i < 100000; i++)
{
   curr = Math.floor(Math.random()*max);
   if (frequency[curr] === undefined) 
   {
      frequency[curr] = -1;
   }
   frequency[curr] += 1;
   if (transitions[old][curr] === undefined)
   {
      transitions[old][curr] = -1;
   }
   transitions[old][curr] += 1;
   old = curr;
}
alert(frequency);
alert(transitions);

暫無
暫無

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

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