/** 语句:random 生成随机数(仅 inVars[0]=min、inVars[1]=max,outVars[0]=目标变量名) */ const { assertStrictKeys } = require('../action-schema.js') const types = ['random'] function parse (action, parseContext) { const { extractVarName } = parseContext const path = parseContext.actionPath || 'random' assertStrictKeys(action, ['type', 'inVars', 'outVars', 'integer'], path) if (!Array.isArray(action.inVars) || action.inVars.length !== 2) { throw new Error(`${path}: random 须 inVars 恰好 2 项 [min, max]`) } if (!Array.isArray(action.outVars) || action.outVars.length !== 1) { throw new Error(`${path}: random 须 outVars 恰好 1 项(写入变量名,如 "{x}")`) } const integer = action.integer !== undefined ? action.integer : true return { type: 'random', integer, min: action.inVars[0], max: action.inVars[1], inVars: action.inVars.map((v) => extractVarName(v)), outVars: [extractVarName(action.outVars[0])], variable: extractVarName(action.outVars[0]), } } async function execute(action, ctx) { const { variableContext, extractVarName } = ctx let varName if (action.outVars && action.outVars.length > 0) { varName = extractVarName(action.outVars[0]) } else if (action.variable) { varName = extractVarName(action.variable) } else { return { success: false, error: 'random 操作缺少 variable 或 outVars 参数' } } let min, max if (action.inVars && action.inVars.length >= 2) { min = Number(action.inVars[0]) max = Number(action.inVars[1]) } else { min = action.min !== undefined ? Number(action.min) : 0 max = action.max !== undefined ? Number(action.max) : 100 } const integer = action.integer !== undefined ? action.integer : true if (isNaN(min) || isNaN(max)) return { success: false, error: 'random 操作的 min 和 max 必须是数字' } if (min > max) return { success: false, error: 'random 操作的 min 不能大于 max' } const randomValue = integer ? Math.floor(Math.random() * (max - min + 1)) + min : Math.random() * (max - min) + min variableContext[varName] = randomValue return { success: true } } module.exports = { types, parse, execute }