Jython中的随机性

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

3
请详细说明您认为的“高效”是什么意思。 - Thorbjørn Ravn Andersen
2
你尝试过测量每个所需的时间吗? - Adam Paynter
2个回答

9

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

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

1000000次循环,三次取最佳结果:每次循环耗时0.266微秒

与之比较:

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

循环1000000次,取最佳结果:每次循环用时1.65微秒。

Jython版本为2.5b3,Java版本为1.5.0_19。


1
timeit,嗯?我必须记住这个!!+1 - richq
timeit是Python中“内置电池”之一。虽然不是必需的,但非常方便。 - Alexander Ljungberg

4

Java的Random类使用(确实必须使用)线性同余算法,而Python则使用Mersenne Twister。 Mersenne保证了极高质量(尽管不是加密质量!)的随机数和一个可笑长的周期(53位精度浮点数,周期2 ** 19937-1); 线性同余生成器有众所周知的问题。 如果您真的不关心随机数的质量,只关心速度,那么LCG很可能会更快,因为它不太复杂。


1
实际上,根据我在D编程语言中进行的一些旧基准测试,Mersenne Twister更快,尽管它使用更多的内存。这是因为Mersenne Twister避免了线性同余所需的除法操作。使用线性同余的唯一好理由是如果您具有极端的内存限制或者只需要少量随机数并且种子生成器的时间是瓶颈。(线性同余具有较小的状态空间,因此种子生成速度更快。) - dsimcha
LCGs在哪里需要除法?大多数使用LCGs的地方会将2的幂作为它们的模数(这使得找到合适的参数更加困难,但速度要快得多)。 - Joey
2
Java规定模数为(2**48)-1,所有Java标准实现都必须严格遵守这一规定,因此我不明白“大多数在某处使用的LCG”与此案例有何关系——java.Random有其自己非常精确的规则。 - Alex Martelli

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接