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

蒙特卡洛模拟多维洗牌累积数组生成问题求助

蒙特卡洛模拟多维累积和数组实现优化

问题需求

已实现单数组洗牌后生成累积和的功能:输入[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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 07:45:38