[英]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.