【问题标题】:Get balanced random values in Javascript在 Javascript 中获取平衡的随机值
【发布时间】:2020-10-02 17:49:14
【问题描述】:

场景

我已经实现了一个虚构的场景来更好地解释这个问题。我有 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 问题还是我的算法有问题?请提供您的意见。

【问题讨论】:

  • “20% 的机会变化”与“价格变化 20%”不同。
  • 8 个帐户还是 800 个帐户?

标签: javascript algorithm random


【解决方案1】:

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

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

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

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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-19
    • 2022-10-08
    • 2019-07-18
    • 1970-01-01
    • 1970-01-01
    • 2017-03-26
    • 2019-01-29
    • 2019-07-21
    相关资源
    最近更新 更多