我有一系列数字,范围从零到无穷大。我需要生成低于数组中数字的随机数,每个数字一个。例如,如果我有数字:
[10, 5, 0, 7]
输出可以是以下任何一种:
[5, 3, 0, 6] or [1, 0, 0, 7] or [10, 5, 0, 7]
这很简单,但我的问题在于下一部分。我必须确保这些数字加起来达到指定的值。例如,相同的第一个数组可以产生:
[4, 3, 0, 1] or [8, 0, 0, 0]
总值为8。
在做了一些研究之后,我找到了this post但遗憾的是,它没有包含每个值的限制。相反,它有一个总数,并根据它生成一组数字。我需要所有这些数字少于输入数组的数字。使用Jquery的each
循环,您可以创建一个小于相应数字的值,但是如何合并总值?
如果有人可以修改该帖子以获得三个值,即total,max和min,那将非常感激。在这一点上,我一无所知。
答案 0 :(得分:1)
这是一个基本的解决方案。请注意,我设置了maxLoops,否则此功能可能会永远运行。
function randomize(array, total){
var maxLoops = 100, randomized;
do{
randomized = array.map(function(value){
return Math.floor(Math.random()*(value+1));
});
maxLoops--;
}while(maxLoops > 0 && randomized.reduce(function(a, b){ return a+b; }) !== total);
return randomized;
}
var test = randomize([10, 5, 0, 7], 8);
console.log(test);
答案 1 :(得分:0)
我会告诉你步骤。这很简单。
首先创建一个函数,该函数将数字数组作为参数,并生成一个小于或等于输入数组的每个元素的随机数组。返回一个关联数组,第一个键映射到所需的总和,第二个键映射到随机生成的数组。
第二次创建一个do while循环,继续调用该函数,直到第一个键等于你想要的元素之和。然后解决方案将成为第二个关键。
function generateRandomArray(input){
output = [];
for(i = 0; i <input.length; i++){
output.push(Math.floor((Math.random() * input[i]) + 1))
}
output_sum = 0
for(i=0; i < output.length; i++){
output_sum += output[i]
}
return {'output_sum':output_sum, 'output_array':output}
}
desired sum = 8
example_input = [10, 5, 0, 7]
do {test_output = generateRandomArray(example_input)['output_sum']} while
(test_output != desired_sum)
correct_array = test_output['output_array]
答案 2 :(得分:0)
我通过约束每个数字的限制在一次通过中解决了这个问题。
<html><body><script language="javascript">
var arry = [10, 5, 0, 7];
var ansa = [];
var required = 8;
var sum = 0;
for (i=0; i<arry.length; i++) {
max = required - sum;
if (max > arry [i])
max = arry [i];
min = required - sum;
for (j=i+1; j<arry.length; j++)
min = min - arry [j];
if (min < 0) min = 0;
if (min > max) {
ansa [i] = 'Impossible';
break;
}
num = min + Math.floor (Math.random () * (max - min + 1));
ansa [i] = num;
sum = sum + num;
}
document.writeln (ansa);
</script></body></html>