在R中生成m个等间距的数字,使它们相加等于1

6

给定数字 m,我们如何生成 m 个等间隔的数字,使它们相加结果为 1,且满足 A1 > A2 > ... > Am

例如,如果 m=4,我们应该得到:

a <- c(0.4, 0.3, 0.2, 0.1)

abs(diff(a))
#[1] 0.1 0.1 0.1

sum(a)
#[1] 1

或者对于 m=5:
b <- c(0.30, 0.25, 0.20, 0.15, 0.10)

abs(diff(b))
#[1] 0.05 0.05 0.05 0.05

sum(b)
#[1]
2个回答

9
如何考虑:
rev(seq_len(m)/sum(seq_len(m)))

a <- rev(seq_len(4)/sum(seq_len(4)))
##[1] 0.4 0.3 0.2 0.1
abs(diff(a))
##[1] 0.1 0.1 0.1
sum(a)
##[1] 1

b <- rev(seq_len(5)/sum(seq_len(5)))
##[1] 0.33333333 0.26666667 0.20000000 0.13333333 0.06666667
abs(diff(b))
##[1] 0.06666667 0.06666667 0.06666667 0.06666667
sum(b)
##[1] 1

4

如果您想要一个可调节的空间或起始点,可以使用公式根据起始点计算出空间或根据空间计算出起始点:

场景1:可调节起始点:

m = 5; s = 0.9

seq(from = s, by = -(m*s - 1) * 2/((m - 1) * m), length.out = m)
#[1]  0.90  0.55  0.20 -0.15 -0.50

sum(seq(from = s, by = -(m*s - 1) * 2/((m - 1) * m), length.out = m))
#[1] 1

情境2:可调节空间:

m = 5; d = 0.2

seq(from = 1/m + ((m - 1) * d/2), by = -d, length.out = m)
# [1]  0.6  0.4  0.2  0.0 -0.2

sum(seq(from = 1/m + ((m - 1) * d/2), by = -d, length.out = m))
# [1] 1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接