【问题标题】:Random function for any possible positive number but likely close to zero任何可能的正数的随机函数,但可能接近于零
【发布时间】:2013-09-14 16:12:07
【问题描述】:

我正在寻找一个随机数函数,它可能会返回任何(正)数,但在统计上不太可能远离零。我有一个算法可以满足我的需求,但似乎效率低下:

def my_random():
    if random.randrange(2):
        return 1 + my_random()
    return 0

我知道可以在不递归的情况下重写它,但这并不能真正否定低效率。任何人都可以提出具有更好性能的替代算法吗?

我的实现语言是python,但算法才是最重要的。

【问题讨论】:

  • 这个问题的答案可能会有所帮助:stackoverflow.com/questions/14266717/…
  • 你可能想搜索“随机数对数分布”有一些很好的解决方案(一些在堆栈溢出)
  • 您是否愿意接受生产数量的上限?
  • P.S.您是否尝试过计时此功能?仅当您获得大量输出时,性能才会受到影响,这在统计上是不可能的。 99% 的返回值将小于等于 6。
  • 是的,我知道该功能不太可能需要很长时间,但在服务器情况下,我希望避免挂起的可能性

标签: performance algorithm random


【解决方案1】:

如果您有一个函数返回[0, 1) 范围内的随机浮点数,例如Python 的random.random,那么您可以从exponential distribution 中采样

def random_exponential(scale=1.):
    x = random.random()
    return -math.log(1. - x) * scale

(受我刚刚阅读的 NumPy 源代码的启发;如果可以选择使用 NumPy,您也可以致电 np.random.exponential。)

如果您需要随机整数,请考虑截断这些。

【讨论】:

  • 这看起来正是我想要的。至少我现在知道它的名字了。谢谢你的回答。
  • Python 已经具有随机指数函数和随机正态函数,但它们的实现并不比您上面的简单代码更好。如果你需要更好的性能,找一个使用 Ziggurat 算法的库(比如我的github.com/lcrocker/ojrandlib
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-16
  • 1970-01-01
  • 2012-02-13
  • 2012-05-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多