【发布时间】:2019-11-12 23:36:45
【问题描述】:
我正在尝试生成等于 100(%) 的数字,但所有数字必须彼此之间至少有 4 个数字。因此,如果我生成 4 个数字,它们必须像这样,例如 [22,28,15,35] 并且不能像这样 [22,28,20,30] 因为 28-30 和 22 - 20 之间的差小于 4。
我能够将生成数字的方法放在一起,看起来像这样。
generate (max, many) {
this.numbers_array = []
this.normalized_numbers_array = []
this.sum = 0
for (let i = 0; i < many; i++) {
this.numbers_array.push(Math.random())
this.sum += this.numbers_array[i]
}
this.remaining = max
for (let i = 0; i < this.numbers_array.length; i++) {
this.outcome= (this.numbers_array[i] / this.sum) * max
this.normalized_numbers_array[i] = Math.floor(this.outcome)
this.remaining -= this.normalized_numbers_array[i]
if (i + 1 == this.numbers_array.length) {
while (this.remaining > 0) {
this.normalized_numbers_array[i]++
this.remaining--
}
}
}
}
并且工作正常。我的下一个方法是尝试通过两个 for 循环和 if 语句来比较规范化的数字。然后根据彼此之间的数字之间的差异,我希望 将 2% 加到一个中,并从正在比较的两个数字中的另一个中减去 2% 。然后我将它们放入我想再次标准化的新数组中。
for (let i = 0; i < this.normalized_numbers_array.length; i++) {
for (let j = i + 1; j < this.normalized_numbers_array.length; j++) {
if (Math.abs(this.normalized_numbers_array[i] - this.normalized_numbers_array[j]) < 5) {
//do something
if (this.normalized_numbers_array[i] > this.normalized_numbers_array[j]) {
//do something
} else if (this.normalized_numbers_array[i] <= this.normalized_numbers_array[j]) {
//do something
}
}
}
}
不过,这种方法是有缺陷的。通过添加或子结构,我可以产生小于 4 的新差异。例如 [35,18,26,21]->[35,16,26,23] 26 和 23 之间的差异更改后为 3。
我的想法是创建另一个循环,只要存在差异,它就会一直运行。但我不确定这会奏效。所以我想知道这个问题是否有更好的工作解决方案 - 也许能够从一开始就生成那些大小不同的数字,而不必在之后更改它们。
【问题讨论】:
-
你的区间是从 1 到 100 吗? [1, 100]?
-
不,也可以是0。
标签: javascript oop random numbers