第一个算法产生的数字太均匀
另请参阅低差异系列。
中的 2 个随机数。对于真实的统一数据,机会是 50:50,它们同时大于或小于 0.5。用你的方法,机会是0。所以你的数据不统一。[0;1]
(正如所指出的,这可能是分层所需的属性。像 Halton 和 Sobel 这样的低差异系列确实有它们的用例。)
一种适当但昂贵的方法(对于实际价值)
... 是使用 beta 分布的随机数。均匀分布的排序统计量是 beta 分布的。您可以使用它来随机绘制最小的,然后是第二小的,...重复。
假设要在中生成数据。最小值为分布。(对于后续情况,减少并重新调整到剩余间隔)。要生成一般的 beta 随机数,我们需要生成两个 Gamma 分布的随机值。但是。然后。为此,我们可以从这个分布中抽取随机数作为。[0;1]Beta[1,n]n1−X∼Beta[n,1]−ln(1−X)∼Exponential[n]−ln(U[0;1])n
−ln(1−x)1−xx=−ln(1−u)n=u1n=1−u1n
产生以下算法:
x = a
for i in range(n, 0, -1):
x += (b-x) * (1 - pow(rand(), 1. / i))
result.append(x)
可能涉及数值不稳定性,并且pow
每个对象的计算和除法可能会比排序慢。
对于整数值,您可能需要使用不同的分布。
排序非常便宜,所以只需使用它
但不要打扰。排序是如此的便宜,所以只需排序。多年来,我们已经很好地理解了如何实现排序双精度数不值得避免的排序算法。理论上它是,但在一个好的实现中,常数项是如此之小,以至于这是一个完美的例子,即理论复杂性结果是多么无用。运行基准测试。生成 100 万个有排序和没有排序的随机数。运行几次,如果排序经常超过非排序,我不会感到惊讶,因为排序的成本仍然会比你的测量误差小得多。O(nlogn)