如何在JavaScript中实现仅单次存储随机数,避免重复生成新值
JavaScript 随机数仅生成存储一次的实现方案
原有代码问题梳理
- 首个版本
move方法判断逻辑错误:if (!this.memory[this.num_move] && this.num_move<=0)仅当num_move为0时才会触发赋值,首次调用后num_move变为1,后续调用逻辑不触发,你遇到的二次调用值变化大概率是测试代码拼写错误(测试代码中的Mahine少了字母c)或环境缓存问题。 - 修改后版本的隐藏问题:
- 没有提前判断
num_move是否超出memory数组长度,未调用start初始化就调用move会直接抛出访问空对象属性的错误 - 进入方法就生成随机数的逻辑不合理,虽不会修改已有值,但不符合「不需要就不生成」的设计逻辑
- 没有提前判断
正确实现方案
方案1:全局仅生成1次随机数,后续调用不修改存储值
完全匹配你「仅首次调用生成存储、后续调用不修改」的需求:
let Machine = { position: 0, num_move: 0, memory: [], // 新增标识判断是否已生成过随机数 hasGenerated: false, generateMove: function () { // 原判断num>=10的逻辑冗余,Math.random()返回[0,1),计算后取值范围就是1-9 return Math.floor((Math.random() * 9) + 1) }, move: function () { // 已生成过直接退出,不执行后续逻辑 if (this.hasGenerated) return const move = this.generateMove() this.memory.push(move) this.num_move += 1 this.hasGenerated = true }, data: function () { return { memory: this.memory, num_move: this.num_move } } }
测试效果:
Machine.move() // 首次调用 console.log(Machine.data()) // {memory: [随机数1-9], num_move: 1} Machine.move() // 后续任意次数调用 console.log(Machine.data()) // 和首次输出完全一致,不会修改
方案2:每个存储位生成1次随机数,存满9个后不再生成
如果你需要依次存储9个不重复生成的随机数,可以用这个版本:
let Machine = { position: 0, num_move: 0, memory: [], start: function () { // 初始化9个空位 for (let index = 0; index < 9; index++) { this.memory.push({move: undefined, isEmpty: true}) } }, generateMove: function () { return Math.floor((Math.random() * 9) + 1) }, move: function () { // 已存满/当前位置已赋值直接退出 if (this.num_move >= this.memory.length || !this.memory[this.num_move]?.isEmpty) { return } const move = this.generateMove() this.memory[this.num_move].move = move this.memory[this.num_move].isEmpty = false this.num_move += 1 }, data: function () { return { memory: this.memory, num_move: this.num_move } } } // 注意调用顺序:必须先初始化再调用move Machine.start()
测试效果:连续调用move9次会依次给memory的0-8下标赋值,第10次开始调用不会产生任何修改。
内容的提问来源于stack exchange,提问作者Alvaro Felipe Pupuche Morales
相关产品推荐
相关产品推荐

