将随机整数分配给数组中的项,summa应该是一个固定的数字

Assign random integer to items in array and summa should ever be a fixed number

本文关键字:数字 一个 summa 分配 整数 随机 数组      更新时间:2023-10-15

这是我的问题

我在一个数组中有一个可变数量的项目

array (x, y, z, ..., n)

我有一个固定的总数分配给一个可变的

$min_int = 0;
$max_int = 8;
$total = 8;

我需要为数组中的每个项分配一个从$min_int到$max_int的随机int,数组中的项总数必须始终=8。

例如:

array (red, green, blue);
$min_int = 0;
$max_int = 8;
$total = 8;

结果可能是

Array
(
    [0] => 3
    [1] => 5
    [2] => 0
)

Array
    (
        [0] => 3
        [1] => 3
        [2] => 2
    )

我会用javascript进行开发。

有什么建议吗?

这是我必须用随机int填充的表的链接。检查客户端的复选框和要填充的天数列,循环必须为所选客户端在所选日期生成随机int,总数必须为=8(col-#SUMMA),因此对于您选择的每一天。

我最直观的猜测是

var max_int = 8;
var first = Math.floor(Math.random() * max_int) + 1;
var second = Math.floor(Math.random() * (max_int - first)) + 1;
var third = max_int - first - second;

但这里可能存在一些数学偏见。我不是数学家,所以这是邀请任何了解统计学的人仔细研究一下。不过,这确实有效,因为如果对第一个、第二个和第三个求和,最终总是得到max_int。

这个解决方案应该满足您的需求:

var $min_int = 0;
var $max_int = 8;
var $total = 8;
var array = new Array(3);
var sum = 0;
var currentMax = $max_int;
for (i = 0; i < array.length; i++) {
    if ((i !== (array.length - 1)) && (currentMax > 0)) {
        var randomNum = parseInt(Math.random() * currentMax);
        array[i] = randomNum;
        currentMax -= randomNum;
    }
    else {
        array[i] = currentMax;
    }
}
console.log(array);

这种方法:1.在阵列的长度上循环,2.对于每个数组元素,它根据最大值创建一个随机整数并存储3.然后,它将最大值减少刚刚生成的数字的值,并为下一个阵列元素重复

注意#1:如果"新的最大值"已达到0(即,生成的随机数将始终为0,因此无需计算)或逻辑已达到数组中的最后一个元素(即,该元素的值应为剩余的"最大值"),它也将跳过处理。

注2:var $min_intvar $total从未实际用于此解决方案。

以下是一些测试值:

对于var array = new Array(3);

[3, 3, 2]
[0, 2, 6]
[8, 0, 0]
[1, 4, 3]
[0, 4, 4]

对于var array = new Array(5);

[4, 0, 1, 0, 3]
[7, 1, 0, 0, 0]
[1, 2, 0, 4, 1]
[3, 4, 1, 0, 0]
[4, 3, 0, 0, 1]

对于var array = new Array(8);

[7, 0, 1, 0, 0, 0, 0, 0]
[3, 2, 3, 0, 0, 0, 0, 0]
[5, 3, 0, 0, 0, 0, 0, 0]
[2, 4, 1, 0, 1, 0, 0, 0]
[7, 0, 1, 0, 0, 0, 0, 0]
相关文章: