You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在JavaScript中实现仅单次存储随机数,避免重复生成新值

JavaScript 随机数仅生成存储一次的实现方案

原有代码问题梳理

  1. 首个版本move方法判断逻辑错误:if (!this.memory[this.num_move] && this.num_move<=0) 仅当num_move为0时才会触发赋值,首次调用后num_move变为1,后续调用逻辑不触发,你遇到的二次调用值变化大概率是测试代码拼写错误(测试代码中的Mahine少了字母c)或环境缓存问题。
  2. 修改后版本的隐藏问题:
    • 没有提前判断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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 20:36:04