蒙特卡洛模拟多维洗牌累积数组生成问题求助
蒙特卡洛模拟多维累积和数组实现优化
问题需求
已实现单数组洗牌后生成累积和的功能:输入[1,2,3,4,5],洗牌后得到[2,4,1,3,5],再生成累积和数组[2,6,7,10,15]。现需扩展为1000次蒙特卡洛模拟,输入格式为[[1,2,3,4,5], 1000],输出由每次模拟的累积和数组组成的二维数组(例如前两次模拟输出为[[2,6,7,10,15],[5,8,9,11,15]])。
原多数组代码问题分析
尝试的FYShuffleArray函数存在以下问题:
- 变量
m未提前声明就用于解析数组的循环,导致语法错误 - 每次模拟直接修改原数组,后续模拟使用的是已洗牌后的数组,结果不独立
sum数组仅初始化一次,每次模拟直接覆盖其元素,导致sumArray中所有元素指向同一个数组引用,最终所有模拟结果相同- 模拟次数写死为
2,未使用传入的次数参数
修正后的实现代码
function FYShuffleArray(input) { const originalArray = input[0]; const simulationCount = input[1]; const sumArray = []; // 提前解析原数组为数值类型,避免重复解析 const parsedArray = originalArray.map(num => parseFloat(num)); for (let j = 0; j < simulationCount; j++) { // 每次模拟都创建原数组的副本,避免修改原数组 const array = [...parsedArray]; let m = array.length; let total = 0; const sum = []; // Fisher-Yates洗牌算法 while (m) { const i = Math.floor(Math.random() * m--); [array[m], array[i]] = [array[i], array[m]]; } // 计算累积和 for (let i = 0; i < array.length; i++) { total += array[i]; sum[i] = total; } sumArray.push(sum); } return sumArray; }
关键优化点
- 使用解构获取输入的原数组和模拟次数,参数逻辑更清晰
- 提前解析原数组为数值类型,减少循环内重复操作
- 每次模拟创建原数组的浅拷贝(
[...parsedArray]),保证每次洗牌基于原始数据,模拟结果完全独立 - 每次循环内重新初始化
sum数组,避免引用共享导致的结果覆盖问题 - 使用
let/const替代var,提升变量作用域安全性 - 用ES6解构赋值简化数组元素交换逻辑,代码更简洁易读
使用示例
// 调用函数进行1000次模拟 const result = FYShuffleArray([[1,2,3,4,5], 1000]); // 输出前两次模拟结果 console.log(result[0], result[1]);
内容的提问来源于stack exchange,提问作者BruteForceWill
相关产品推荐
相关产品推荐

