掷骰子的公式?
Math.floor(Math.random() * 6) + 1生成1-6的均等整数。投硬币则用Math.round(Math.random())得到0或1。
自定义范围和数量生成随机数
伪随机,统计分布良好,但若知道种子就可预测。安全用途请用crypto.getRandomValues(),它使用操作系统的随机性池。
Math.floor(Math.random() * 6) + 1生成1-6的均等整数。投硬币则用Math.round(Math.random())得到0或1。
对[1..45]数组使用Fisher-Yates洗牌,取前6个元素。这样可以得到无重复的完全随机组合。
计算机大多数情况下使用"伪随机数",Math.random()基于种子值的确定性算法生成看似随机的序列。真随机数需要来自物理现象的熵,如放射性衰变或热噪声。对于游戏和模拟,伪随机就足够了,但在密码学场景中,两者的区别至关重要。
如果攻击者能推断出Math.random()使用的种子,就能重现所有"随机"值——包括令牌、会话ID和密码重置链接。Web Crypto API的crypto.getRandomValues()使用操作系统的随机性池,适合安全敏感的应用场景。凡是需要不可猜测的值,都应使用crypto API而非Math.random()。
Fisher-Yates洗牌算法从后向前遍历数组,在每一步将当前元素与随机位置的元素交换,时间复杂度O(n)。朴素的"生成并检查重复"方法在接近极限时会变得很慢,而Fisher-Yates始终线性运行,是现代洗牌算法的基础。
好的随机数生成器产生均匀分布,范围内每个值出现的概率相等。整数范围公式:Math.floor(Math.random() * (max - min + 1)) + min。若需要正态分布或泊松分布来模拟自然现象,则需要额外的Box-Muller变换等处理。
赌场的庄家优势来自数学设计,而非随机数作弊。轮盘有37个槽(0-36),当0出现时庄家收回所有筹码,产生2.7%的庄家优势。在线赌博需要经第三方认证的随机数生成器,公平赌博平台还使用密码学承诺让玩家验证每局的随机性。