HOWTO · JavaScript
如何在 JavaScript 中生成隨機布林值
本文演示瞭如何使用各種方法在 JavaScript 中生成隨機布林值。學習使用 Math.random()、位運算和整數轉換來建立動態且引人入勝的應用程式。探索可提升你程式設計技能的實用範例和說明。
本頁內容
要在 JavaScript 中建立一個隨機的 true 或 false 值,請將 Math.random() 與 0.5 進行比較。這一內建方法返回一個從 0(包含)到 1(不包含)之間的數字,如 MDN 的 Math.random() 參考 中所述。該比較將這一範圍劃分為大小相等的兩部分。
使用 Math.random() 生成隨機布林值
下面這個自包含的範例對於至少為 0.5 的值返回 true,對於小於它的值返回 false:
function getRandomBoolean() {
return Math.random() >= 0.5;
}
console.log(getRandomBoolean());
true
每次函式運行時都會呼叫 Math.random(),因此後續呼叫可能返回任意一個布林值。
將隨機整數轉換為布林值
Math.floor(Math.random() * 2) 會產生整數 0 或 1:乘法對隨機範圍進行縮放,而 Math.floor() 向下取整。Boolean() 將 0 對映為 false,將 1 對映為 true:
Boolean(Math.floor(Math.random() * 2))
這是另一種生成這兩個布林值的原生方法。上面的閾值比較更短;兩者都依賴 Math.random()。
使用位運算生成布林值
下面的運算式對縮放後的隨機數和 1 應用按位與(&)。雙重否定(!!)將數值結果轉換為布林值:
!!(Math.random() * 1000 & 1)
這是一個替代的、較不直接的運算式。它使用與運算而非或運算,在此並未確立其具有特殊的效能優勢。
從陣列中選擇一個布林值
要從陣列中選擇這兩個值之一,請使用隨機索引。用陣列長度相乘並應用 Math.floor(),可以得到 Math.random() 返回值所對應的、位於陣列範圍內的索引:
const values = [true, false]; const result = values[Math.floor(Math.random() * values.length)];
這一模式也適用於其他陣列:將 values 替換為你想要抽樣的集合即可。
使用 Lodash 的 _.sample(collection)
如果你的頁面或專案中已經可用 Lodash,_.sample(collection) 會從一個集合中選擇一項。對於布林值,使用 [true, false] 呼叫它:
_.sample([true, false])
確保在呼叫此方法之前已載入或匯入 Lodash。此處未驗證目前的 CDN 地址,因此請使用你專案文件中記載的安裝方法,而不要依賴舊的 URL。
FAQ
Math.random() 在 JavaScript 中是如何工作的?
Math.random() 返回 [0, 1) 範圍內的浮點數:0 可能出現,而 1 被排除。將結果與 0.5 比較,會將低於閾值的值對映為 false,將大於或等於閾值的值對映為 true。
不使用 Math.random() 可以生成隨機布林值嗎?
本文中的方法都直接或透過輔助庫使用 Math.random()。對於需要安全敏感的隨機值的應用程式,請使用 Web Crypto API 的 Crypto.getRandomValues() 而不是 Math.random();本文的範例適用於普通的選擇和模擬。
這些方法之間存在效能差異嗎?
本文未提供這些方法的效能測量資料。請根據可讀性以及你的專案是否已經使用 Lodash 來選擇。
我可以生成具有特定機率的布林值嗎?
可以。使用 Math.random() < threshold 時,[0, 1] 範圍內的閾值會給出相應的 true 機率:例如,0.2 給出 20% 的機率。閾值小於或等於 0 時始終產生 false,而閾值大於或等於 1 時始終產生 true,因為 Math.random() 返回 [0, 1) 範圍內的值,且比較是嚴格的 <。閾值為 0.5 時,true 和 false 的機會相等。
JavaScript 中有用於生成隨機值的庫嗎?
Lodash 提供了 _.sample(collection),當傳入 [true, false] 時,它可以在 true 和 false 之間進行選擇。在呼叫它之前,Lodash 必須在你的頁面或專案中可用。原生的 Math.random() 方法不需要額外的庫。