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() 方法不需要额外的库。