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

JS开发Discord机器人遇Math.random返回负数问题求解决方法

问题修复方案

负数产生原因

你遇到的负数问题和Math.random()无关,是代码里的余额计算逻辑写反、执行顺序错误导致的:

  1. 抢劫成功时,你给受害者设置余额用了amount - victimWallet,正确逻辑应该是受害者原有余额减去被抢金额,写反后自然会出现负数
  2. 抢劫失败分支你先执行了return发送消息,后续的数据库修改代码完全不会执行,且两次修改操作都错误指向了抢劫者的钱包,余额计算同样写反
  3. 受害者钱包为空的判断缺少return,后续代码仍会执行,会出现Math.random() * null的异常情况

修复步骤

  • 给受害者钱包为空的判断加return阻断后续逻辑
  • 修正抢劫成功后的余额计算逻辑,将受害者余额改为victimWallet - amount
  • 调整抢劫失败分支的执行顺序:先修改数据库再返回消息,同时修正余额计算逻辑和更新的用户ID
  • 用Math.max()给随机金额兜底,避免生成0金额
  • 把随机结果的判断改为else,避免random=30时无逻辑执行的问题

修复后代码

let db = require(`quick.db`)

module.exports = {
  name: "rob",
  description: "Rob your friends to get money",
  category: "economy",
  usage: "rob [member]",
  timeout: "1 minute",
  run: async (client, message, args) => {
    let victim = message.mentions.members.first()
    if(!victim) {
      return message.channel.send(`:x: Please specify a member to rob!`)
    }

    let victimW = await db.get(`wallet_${victim.id}`) || 0
    if(victimW <= 0) {
      return message.channel.send(`:x: That user doesn't have money in his wallet, are you sure you want to rob him?`)
    }

    let random = Math.floor(Math.random() * 100);
    if(random < 30) {
      let victimWallet = await db.get(`wallet_${victim.id}`) || 0
      let userWallet = await db.get(`wallet_${message.author.id}`) || 0
      // 兜底最少抢1块
      let amount = Math.max(1, Math.floor(Math.random() * victimWallet));
      const messages = [`POG! You robbed **${victim.username}** and got **${amount}** :coin:!`, `oo seems like you robbed **${victim.displayName}** and got **${amount}** :coin:!`]
      const randomMessage = messages[Math.floor(Math.random() * messages.length)];
      // 修正受害者余额计算
      await db.set(`wallet_${victim.id}`, victimWallet - amount)
      await db.set(`wallet_${message.author.id}`, userWallet + amount)
      message.channel.send(randomMessage)
    } else {
      let authorWallet = await db.get(`wallet_${message.author.id}`) || 0
      if(authorWallet <= 0) {
        return message.channel.send(`:x: You don't have any money to pay the fine if you get caught!`)
      }
      let wallet1 = await db.get(`wallet_${victim.id}`) || 0
      // 兜底最少罚1块
      let amountPaid = Math.max(1, Math.floor(Math.random() * authorWallet));
      const message1 = [`Pfft noob, you got caught and paid **${victim.displayName} ${amountPaid}** :coin: lol!`, `lel ure such a noob, you paid **${victim.displayName} ${amountPaid}** :coin:!`, `u suck and you paid **${amountPaid}** :coin: to **${victim.displayName}**, such a noob lol!`]
      const randomMessage1 = message1[Math.floor(Math.random() * message1.length)];
      // 修正余额计算和更新的用户ID
      await db.set(`wallet_${message.author.id}`, authorWallet - amountPaid);
      await db.set(`wallet_${victim.id}`, wallet1 + amountPaid);
      return message.channel.send(randomMessage1)
    }
  }
}

内容的提问来源于stack exchange,提问作者Refluent

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 22:12:02