向数组中添加或减去随机数的算法,使任何数字的差都不超过8



有一个由16个数字组成的序列,可以从下面的一组数字{-8,-4,0,4,8}中随机添加,但考虑到新生成的序列不应该有任何两个相差超过8的数字。

我正在尝试一种有效的算法,它可以在不违反约束的情况下生成应该添加的数字集。

如果可以处理连续的范围,问题会稍微容易一些。以下是Ruby中一个备受评论的实现:

# Note that generating from the set {-8, -4, 0, 4, 8} is equivalent to
# generating integers in the range -2..2 and scaling by 4.  Working with
# contiguous ranges is easier, just upscale before using or printing.
MAX_DELTA = 8 / 4   # specified maximum difference between any pair of values in scaled range
N = 16              # number of values to generate
data = []   # start with an empty array
data << rand(-2..2)   # generate first (anchor) value in rescaled range
(N - 1).times do      # generate remaining N-1 values by... 
range_min, range_max = data.minmax    # finding min & max of current set
# determine new range based on the current range + absolute constraints
new_range_min = [range_max - MAX_DELTA, -2].max
new_range_max = [range_min + MAX_DELTA,  2].min
# generate and store new value
data << rand(new_range_min..new_range_max)
end
# remap results to actual desired range
data.map! { |i| 4 * i }
# print results separated by commas.
puts data.join(', ')

这会产生如下输出:

4, -4, -4, 4, -4, 4, 0, 0, -4, -4, -4, 0, 0, 4, 4, -4

4, 8, 8, 8, 8, 4, 4, 4, 0, 4, 8, 0, 0, 0, 4, 0

这个区域的某些东西:

const numbers = [-8, -4, 0 , 4, 8];
function getRandomNumber() {
return numbers[Math.floor(Math.random() * numbers.length)]
}
function difference(a, b) {
return Math.abs(a - b);
}
function calculateNewArray() {
const values = [];
while (values.length < 16) {
const random = getRandomNumber();
// add any number the first iteration
if (values.length === 0) values.push(random);
if (difference(values[values.length -1], random) < 9) {
values.push(random)
}
}
return values;
}
calculateNewArray()
// [0, 0, 4, -4, 0, -4, 4, -4, 0, -4, -4, -4, -4, -8, -8, -4]

我根本没有测试它,感谢任何反馈。

最新更新