如何有效地生成间隔中的排序均匀分布值?


12

假设我要从interval生成一组随机数(a, b)。生成的序列还应该具有对其进行排序的属性。我可以想到两种方法来实现这一目标。

n是要生成的序列的长度。

第一种算法:

Let `offset = floor((b - a) / n)`
for i = 1 up to n:
   generate a random number r_i from (a, a+offset)
   a = a + offset
   add r_i to the sequence r

第二算法:

for i = 1 up to n:
    generate a random number s_i from (a, b)
    add s_i to the sequence s
sort(r)

我的问题是,算法1产生的序列是否与算法2产生的序列一样好?


顺便说一句,在中生成排序后的随机数列表非常容易R。为了在均匀间隔[ a b ]上生成n个随机数的数组,以下代码起作用:。ķñ[一种b]rand_array <- replicate(k, sort(runif(n, a, b))
罗伯特·F

Answers:


18

第一种算法严重失败有两个原因:

  1. 的底值可以大大减小它。的确,当b a < n时,它将为零,为您提供了一个值都相同的集合!一种-b/ñb-一种<ñ

  2. 当您不发言时,结果值分布得太均匀 例如,在 iid均匀变量的任何简单随机样本中(例如和),存在机会最大将不在到的上限区间内。使用算法1,最大值有机会在该间隔内。在某些方面,这种超均匀性是好的,但是总的来说,这是一个可怕的错误,因为(a)许多统计信息将被破坏,但(b)很难确定原因。一个= 0 b = 1 1 - 1 / Ñ ñ1 / Ë 37 1 - 1 / ñ 1 100 ñ一种=0b=1个1个-1个/ññ1个/Ë371个-1个/ñ1个100

  3. 如果要避免排序,请生成独立的指数分布变量。用它们的和除以将它们的累积和标准化为范围。删除最大值(始终为)。重新缩放到范围a b 0 1 1ñ+1个01个1个一种b

显示了所有三种算法的直方图。(每个图描绘了独立的集合的累积结果,每组n = 100个值。)算法1的直方图中缺少任何可见的变化就表明存在该问题。其他两种算法的变化正是您所期望的-以及您需要从随机数生成器获得的变化。1000ñ=100

有关模拟独立均匀变量的更多(有趣的)方法,请参见使用正态分布的绘图来模拟均匀分布的绘图

图:直方图

这是R产生图形的代码。

b <- 1
a <- 0
n <- 100
n.iter <- 1e3

offset <- (b-a)/n
as <- seq(a, by=offset, length.out=n)
sim.1 <- matrix(runif(n.iter*n, as, as+offset), nrow=n)
sim.2 <- apply(matrix(runif(n.iter*n, a, b), nrow=n), 2, sort)
sim.3 <- apply(matrix(rexp(n.iter*(n+1)), nrow=n+1), 2, function(x) {
  a + (b-a) * cumsum(x)[-(n+1)] / sum(x)
})

par(mfrow=c(1,3))
hist(sim.1, main="Algorithm 1")
hist(sim.2, main="Algorithm 2")
hist(sim.3, main="Exponential")

您对我的答案中的算法(基于排名统计)有何看法?;-)
退出–Anony-Mousse 2015年

@Anony这是我的算法3的一个效率较低的版本。(您似乎涉及很多不必要的重新缩放。)您通过获取制服的对数来生成指数变量,这是标准的。
ub

6

第一种算法产生间隔太均匀的数字

另请参见低差异系列

[0;1个]

(如指出的那样,这可能是理想的属性,例如用于分层。像Halton和Sobel 这样的低差异序列确实有其用例。)

适当但昂贵的方法(对于实际价值)

...将使用Beta分布的随机数。均匀分布的等级统计是beta分布。您可以使用它随机绘制最小的,然后第二个最小的,...重复。

[0;1个]贝塔[1个ñ]ñ1个-X贝塔[ñ1个]-ln1个-X指数的[ñ]-lnü[0;1个]ñ

-ln1个-X=-ln1个-üñ1个-X=ü1个ñX=1个-ü1个ñ

产生以下算法:

x = a
for i in range(n, 0, -1):
    x += (b-x) * (1 - pow(rand(), 1. / i))
    result.append(x) 

可能涉及数值不稳定性,并且pow每个对象的计算和除法可能比排序慢。

对于整数值,您可能需要使用其他分布。

排序非常便宜,所以只需使用它

Øñ日志ñ


1
可能有避免排序的原因。一种是当您要生成大量随机变量时,以至于标准排序例程无法处理它们。
whuber

我认为使用浮点数学求和的数值问题早已成为一个问题。(还有伪随机数中循环模式的问题!)将排序方法扩展到TB或分布式系统上的EB相当容易。
已退出-Anony-Mousse 2015年

1012

好的,不必存储它们是一个参数。但是,那么您将需要我的方法,使用累计总和的变量3将不起作用。
已退出–Anony-Mousse 2015年

这是一个很好的观点。现在,我看到了额外计算的优点!(+1)
傻子

5

它还取决于您对随机数的处理方式。对于数值积分问题,一种方法(当通过除去下层运算符进行校正时)将产生优越的点集。您正在做的是分层抽样的一种形式,它的优点是可以避免结块。例如,不可能将所有值都设为0-(ba)/ n。也就是说,对于其他应用程序来说,这可能非常糟糕,这取决于您要如何处理。


2
+1我认为这是对这个问题的有用贡献,尤其是通过分层来表征算法1时。
ub
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.