【问题标题】:Randomize multiple integers to equal variable将多个整数随机化为相等的变量
【发布时间】:2017-07-30 00:36:33
【问题描述】:

使用 JavaScript,我将如何生成 30 个随机整数并使这 30 个整数的总和为 60000?我需要脚本在每次运行时生成一组不同的数字,确保总数始终为 60000

var n = 30;
var total = 60000;
var min = 10;
var max = 5000;

for (i = 0; i < n; i++) { 
  // Math.floor(Math.random()*(max-min+1)+min); ??
} 

为了避免数字过大和过小,可能需要最小值和最大值

【问题讨论】:

  • 是的。不是语言,而是逻辑。一旦你有了算法,你就可以用任何语言实现这一点。另外,很抱歉,如果这很粗鲁,但是您的代表的用户应该知道问题的基本部分
  • 您对数字的范围或统一性还有其他要求吗?使所有数字完全随机有点困难,因为如果您生成 29 个数字,最后一个数字就不能再随机了,因为它必须正好是 60000-(前 29 个数字的总和)。如果您想要真正的随机数和分布,则必须采用其他方法。
  • 无其他要求。在每个循环之后,您不能将总数减去前一个随机整数吗?当 n = 30 时。余数 = 60000 - 29 个整数
  • 是的,就像我说的。最后一个数字不会是随机的。平均而言,它可能比其他数字小得多或大得多。
  • 根据结果的一致性,您可以提出一些动态规划解决方案,根据您返回的内容,将循环的每次迭代中的随机数限制在某个范围内。

标签: javascript html integer


【解决方案1】:

你可以试试这样的:

逻辑

  • 接受最大总数和结果数字的总数。
  • 现在循环基于此number - 1 用于n-1 随机数,最后一个值应为max - currentSum。由于其余数字是随机的,因此这种差异也是随机的,这也将确保总数相等。
  • 现在您需要做的就是根据给定范围返回一个随机数。

我还添加了一个标志来检查唯一值。目前我刚刚添加了1,但这并不能确保它的唯一性,而是因为它超出了范围,所以没有纠正它。

代码

function getRandomInRange(max) {
  var raiseVal = Math.pow(10, (max.toString().length - 1) || 1);
  return Math.floor(Math.random() * raiseVal) % max;
}

function getRandomNumbers(max, n, uniqueNum) {
  var nums = [];
  var sum = 0;

  for (var i = 0; i < n - 1; i++) {
    let r = getRandomInRange(max - sum);
    if(uniqueNum && nums.indexOf(r) > -1){
      r += 1;
    }
    
    nums.push(r)
    sum += r;
    
  }
  nums.push(max - sum);
  console.log(nums)
  return nums
}

getRandomNumbers(3, 3, true)
getRandomNumbers(3, 3)
getRandomNumbers(1000, 10)
getRandomNumbers(600000, 30)

【讨论】:

  • 结果并不是完全随机的,正如您从上次测试中看到的那样:几乎每次您在开始时获得较大的数字,而在结束时获得较小的数字。但既然 OP 说这方面没有要求,那么这也许符合他们的目的。
  • @JJJ 是的。即使我在您之前的评论之后也注意到了这一点。
猜你喜欢
  • 1970-01-01
  • 2013-04-21
  • 1970-01-01
  • 2012-12-15
  • 1970-01-01
  • 1970-01-01
  • 2017-09-17
  • 2011-10-02
  • 2018-08-10
相关资源
最近更新 更多