添加到特定数字的Javascript随机值

时间:2014-10-15 22:13:03

标签: javascript jquery random

我有一系列数字,范围从零到无穷大。我需要生成低于数组中数字的随机数,每个数字一个。例如,如果我有数字:

[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,那将非常感激。在这一点上,我一无所知。

3 个答案:

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

http://jsfiddle.net/fx7a1w28/

答案 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>