首页 > 解决方案 > 在 Javascript 中获取平衡的随机值

问题描述

设想

我已经实现了一个虚构的场景来更好地解释这个问题。我有 800 个银行账户,每个账户都投资了 100 美元,为期 1 年。每天,(使用随机函数)该值增加或减少 20%。因此,1 年后,如果我检查我的银行账户,大约 50% 的账户余额应该大于 100 美元。

问题

使用 javascript 内置随机函数,我得到 12% 到 16% 的账户,其中价值增加了​​,而在多次运行后价值减少了。

代码

let prices = [100, 100, 100, 100, 100, 100, 100, 100];
let days = 365;
let experiment_runs = 100;
let result = {
  increased: 0,
  decreased: 0
}

for (let e = 0; e < experiment_runs; e++) {
  prices = [100, 100, 100, 100, 100, 100, 100, 100];
  for (let i = 0; i < days; i++) {
    for (let j = 0; j < prices.length; j++) {
      // Change price by 20%
      let delta = (Math.random() - 0.5) * 0.4 * prices[j];
      // console.log("Delta", delta);
      prices[j] += delta;
    }
  }

  console.log(prices);

  for (let p of prices) {
    if (p > 100) {
      result.increased++;
    } else {
      result.decreased++;
    }
  }
}

console.log(result);

输出

{increased: 107, decreased: 693}

这是javascript问题还是我的算法有问题?请提供您的意见。

标签: javascriptalgorithmrandom

解决方案


这是因为按百分比增加和减少不会平等地相互抵消。高余额的百分比大于低余额的相同百分比,因此损失往往超过收益。

只考虑 2 天,假设价格一天上涨 20%,另一天下跌 20%。第 1 天后余额为120,第 2 天后余额为96;它不会返回100(如果交换了天的顺序,结果是相同的,因为乘法是可交换的和关联的)。所以即使你有相同数量的增加和减少,最终的结果是减少。

如果您将其更改为固定数量的增加,例如从-5到的随机数量5,那么您将获得大致相等数量的增加和减少的预期结果。

let prices = [100, 100, 100, 100, 100, 100, 100, 100];
let days = 365;
let experiment_runs = 100;
let result = {
  increased: 0,
  decreased: 0
}

for (let e = 0; e < experiment_runs; e++) {
  prices = [100, 100, 100, 100, 100, 100, 100, 100];
  for (let i = 0; i < days; i++) {
    for (let j = 0; j < prices.length; j++) {
      // Change price by -5 to 5
      let delta = (Math.random() - 0.5) * 10;
      // console.log("Delta", delta);
      prices[j] += delta;
    }
  }

  for (let p of prices) {
    if (p > 100) {
      result.increased++;
    } else {
      result.decreased++;
    }
  }
}

console.log(result);


推荐阅读