【问题标题】:generating sorted random numbers without exponentiation involved?生成排序的随机数而不涉及求幂?
【发布时间】:2013-11-21 10:04:40
【问题描述】:

我正在寻找一种数学方程或算法,它可以在 [0,1] 范围内按升序生成统一随机数,而无需除法运算符的帮助。我热衷于跳过除法运算,因为我正在硬件中实现它。谢谢。

【问题讨论】:

  • 你如何表示这些数字?还是也开放讨论?
  • @amit 这将是我硬件中的定点小数。但这种表示不会影响我正在寻找的答案。
  • 你想要多少个数字?你不能只生成 N 个随机数并按升序对它们进行排序吗?或者在第(k-1)个随机数和1范围内生成第k个随机数?
  • @AbhishekBansal (Ans-1)说,500 个数字在 1 次迭代中,我可能有 N 次迭代。无论如何,我想生成多少个随机数不会改变我正在寻找的答案。 (Ans-2)嗯,生成随机数并对其进行排序是常规方法。这里的想法是跳过排序过程。 (Ans-3)如果您可以提供一个不使用除法运算符生成第k个随机数的示例,那么这就是我的问题的答案。
  • 这些数字如何“统一”?

标签: algorithm statistics distribution probability uniform


【解决方案1】:

按升序(或降序)生成数字意味着按顺序生成它们,但分布正确。反过来,这意味着我们需要知道一组大小为 N 的最小值的分布,然后在每个阶段我们需要使用调节来根据我们已经看到的内容确定下一个值。除了避免除法的问题之外,这些在数学上都很简单。

您可以使用算法 min = 1 - U**(1/N) 从单个统一 (0,1) 随机数 U 中生成 N 个统一 (0,1) 的最小值,其中 ** 表示求幂。换句话说,制服的第 Nth 根的补码与在 [0,1] 范围内的 N 个制服的最小值具有相同的分布,然后可以将其缩放到任何其他区间长度你喜欢。

条件方面基本上是说已经生成的 k 值将吃掉原始区间的一部分,我们现在想要的是 N-k 值的最小值,缩放到剩余范围。

结合这两个部分产生以下逻辑。生成 N 个制服中最小的一个,按剩余的间隔长度(第一次为 1)对其进行缩放,并将该结果作为我们生成的最后一个值。然后生成 N-1 个制服中最小的一个,按剩余的间隔长度对其进行缩放,并将其添加到最后一个制服中,为您提供下一个值。起泡、冲洗、重复,直到您完成所有操作。假设您在此之前已读取或指定 N,则以下 Ruby 实现给出了分布正确的结果:

last_u = 0.0
N.downto(1) do |i|
  p last_u += (1.0 - last_u) * (1.0 - (rand ** (1.0/i)))
end

但是我们有那个讨厌的 ith 根,它使用除法。但是,如果我们提前知道 N,我们可以离线预先计算从 1 到 N 的整数的逆并将它们表。

last_u = 0.0
N.downto(1) do |i|
  p last_u += (1.0 - last_u) * (1.0 - (rand ** inverse[i]))
end

我不知道有什么方法可以在不使用幂运算的情况下按顺序获得正确的分布行为。如果这是一个阻碍,你将不得不放弃过程的顺序性或均匀性要求。

【讨论】:

    【解决方案2】:

    您可以尝试所谓的“分层抽样”,这意味着您将范围划分为 bin,然后从 bin 中随机抽样。这样生成的样本比从整个区间生成的样本更均匀(更少聚集)。出于这个原因,分层抽样减少了蒙特卡洛估计的方差(我认为这对您来说并不重要,但这就是发明该方法的原因,作为减少方差的方法)。

    按顺序生成数字是一个有趣的问题,但我的猜测是,要在整个区间内获得均匀分布,您将不得不应用一些需要更多计算的公式。如果你想最小化计算时间,我怀疑你最好的办法就是生成一个样本然后对其进行排序。

    【讨论】:

      猜你喜欢
      • 2019-06-03
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多