JavaScript的Math对象random方法是否会自动设置基于时间的种子?
关于JavaScript
Math.random() 的种子相关问题解答 Math.random()没有公开的种子设置方法
你观察得没错:JavaScript的Math.random()从设计上就没有提供手动设置种子的API,IDE智能感知里找不到相关方法是完全正常的——因为ECMAScript规范根本没定义这类接口,所有符合规范的JS环境都不会暴露这类功能。ECMAScript规范对种子初始化的要求
规范明确规定:随机数生成器(RNG)必须在程序启动阶段自动完成种子初始化,而且生成的随机序列必须是不可预测的(现代ES规范要求达到加密安全级别)。规范没限定具体时机,但实际场景里,浏览器一般会在启动时或首个脚本执行前完成种子的内部设置,Node.js等其他环境则在进程启动时完成这一步。开发者无法干预种子设置
种子的初始化是JS环境内部的操作,开发者没有合法途径修改或指定种子值。如果需要生成可复现的随机序列,得自己实现带种子的伪随机数生成器,比如线性同余生成器(LCG)这类简单实现:// 简单的带种子伪随机数生成器示例 function SeededRandom(seed) { this.seed = seed % 2147483647; if (this.seed <= 0) this.seed += 2147483646; } SeededRandom.prototype.next = function() { return this.seed = this.seed * 16807 % 2147483647; } SeededRandom.prototype.nextFloat = function() { return (this.next() - 1) / 2147483646; }
内容的提问来源于stack exchange,提问作者Armend Veseli
相关产品推荐
相关产品推荐

