Southern Wind 2024-04-15 15:44 采纳率: 50%
浏览 3

javascript一键生成数量

有一个数组

    let newArrAdd = [
            { a: 3.6, num: 3 },
            { a: 4.5, num: 1 },
        ];

已知一个总数sum = 300,也就是说 300 >=newArrAdd[0]anewArrAdd[0]bnum + newArrAdd[1]anewArrAdd[1]num
那么如何用点击事件将这个300随机分配到每个对象的num中,让他们的总数最接近于300,

  • 写回答

4条回答 默认 最新

  • 码农阿豪 Java领域优质创作者 2024-04-15 15:44
    关注
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    问题分析: 这个问题是要求将300随机分配到数组中的每个对象的num中,使得它们的总和最接近于300。因为是随机分配,所以不能保证每次运行的结果都一样,但应尽可能保证随机性和准确性。 解决方案: 首先,可以先计算出数组中原先每个对象的num的总和sum1,然后用300减去sum1得到剩余的数sum2。接下来,可以用以下步骤来随机分配这个数:
    1. 计算出每个对象的权重weight,即该对象的a值除以数组中所有对象的a值之和的比例。权重是一个小数,但可以将其转为整数,便于随机分配。例如,对于数组中的第一个对象,其权重为3.6/(3.6+4.5)=0.44444444,将其乘以10000并向下取整得到444,即它的权重为444。同理,第二个对象的权重为556。
    2. 将剩余的数sum2随机分配给数组中的每个对象。可以先将sum2除以数组中所有对象的权重之和,得到每个权重应该获得的数的平均值avg。例如,在上面的例子中,sum2为60,权重之和为1000,因此avg=60/1000=0.06。然后对于每个对象,可以根据其权重和avg计算出该对象应该获得的数的个数num2,然后将num2添加到该对象的num中即可。 代码实现: 下面是一个基于JavaScript的实现。假设点击事件是点击一个按钮,代码中使用了jQuery。请注意,这个实现并不能保证每次的结果都一样,但应该可以得到一个比较好的随机分配。如果需要更好的随机性和准确性,可以采用更复杂的算法,如模拟退火算法等。
    $('#button').click(function() {
      let newArrAdd = [
        {a: 3.6, num: 3},
        {a: 4.5, num: 1},
      ];
      let sum1 = newArrAdd.reduce((acc, obj) => acc + obj.num, 0);
      let sum2 = 300 - sum1;
      let weights = newArrAdd.map(obj => Math.floor(obj.a / newArrAdd.reduce((acc, obj1) => acc + obj1.a, 0) * 10000));
      let weightSum = weights.reduce((acc, w) => acc + w, 0);
      let avg = sum2 / weightSum;
      let nums2 = weights.map(w => Math.floor(w * avg));
      for (let i = 0; i < newArrAdd.length; i++) {
        newArrAdd[i].num += nums2[i];
      }
    });
    评论

报告相同问题?

问题事件

  • 创建了问题 4月15日

悬赏问题

  • ¥15 C++ yoloV5改写遇到的问题
  • ¥20 win11修改中文用户名路径
  • ¥15 win2012磁盘空间不足,c盘正常,d盘无法写入
  • ¥15 用土力学知识进行土坡稳定性分析与挡土墙设计
  • ¥70 PlayWright在Java上连接CDP关联本地Chrome启动失败,貌似是Windows端口转发问题
  • ¥15 帮我写一个c++工程
  • ¥30 Eclipse官网打不开,官网首页进不去,显示无法访问此页面,求解决方法
  • ¥15 关于smbclient 库的使用
  • ¥15 微信小程序协议怎么写
  • ¥15 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?