【问题标题】:Randomness in JythonJython 中的随机性
【发布时间】:2009-07-23 18:10:07
【问题描述】:

在 Jython 中使用(伪)随机数时,使用 Python random 模块还是 Java 的 random 类会更有效吗?

【问题讨论】:

  • 请详细说明您认为“高效”的内容。
  • 你试过测量每个所需的时间吗?

标签: java python random jython


【解决方案1】:

在我的 Mac 上进行简单测试时,Python 的版本要快得多:

jython -m timeit -s "import random" "random.random()"

1000000 次循环,3 次中的最佳:每个循环 0.266 微秒

 jython -m timeit -s "import java.util.Random; random=java.util.Random()" "random.nextDouble()"

1000000 次循环,3 次中的最佳:每个循环 1.65 微秒

Jython 版本 2.5b3 和 Java 版本 1.5.0_19。

【讨论】:

  • 时间,嗯?我一定要记住那个!! +1
  • timeit 是那些 python '包括电池'的东西之一。不是绝对必要的,但很高兴拥有。
【解决方案2】:

Java 的 Random 类使用(并且 Java 规范确实必须使用)线性同余算法,而 Python 使用 Mersenne Twister。 Mersenne 保证极高的质量(虽然不是 crypto 质量!)随机数和非常长的周期(53 位精度浮点数,周期 2**19937-1);线性同余生成器有众所周知的issues。如果您并不真正关心随机数的质量,而只关心速度,那么 LCG 可能会更快,因为它不那么复杂。

【讨论】:

  • 实际上,根据我在 D 编程语言中所做的一些旧基准测试,Mersenne Twister 更快,尽管它使用更多内存。这是因为 Mersenne twister 避免了线性同余需要的除法运算。使用线性同余的唯一充分理由是,如果您有极端的内存限制,或者您只需要几个随机数,并且播种生成器所需的时间是一个瓶颈。 (线性同余的状态空间更小,因此播种速度更快。)
  • LCG 在哪里需要分工?大多数在某处使用的 LCG 都使用 2 的幂作为其模数(这使得找到合适的参数变得更加困难,但速度要快得多)。
  • Java 指定的模数正好为 (2**48)-1,所有 Java 标准实现都必须完全使用它,所以我看不出“在某处使用的大多数 LCG”必须用case做——java.Random有它自己非常精确的规则。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-15
  • 1970-01-01
  • 2019-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多