首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在java跨平台中生成一个没有时间的随机生成器

在java跨平台中生成一个没有时间的随机生成器
EN

Stack Overflow用户
提问于 2013-02-11 09:44:17
回答 5查看 1.7K关注 0票数 6

我几乎同时在两个线程上初始化两个随机数生成器,我希望这两个生成器的行为完全不同。我会在两个生成器上一个接一个地调用Random.nextInt(7)。使用System.currentTimeMillis()不是一个好主意,因为我的计算机看起来太快了,很有可能我从两个生成器中得到的数字是相同的。那么,有没有办法配置Random,使它们一个接一个地被调用,但它们的行为仍然不同呢?我希望解决方案是跨平台兼容的,所以任何特定于平台的想法都是不可接受的,比如从/dev/random读取。谢谢你的帮助。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-02-11 09:46:43

一种方法:为每个随机实例设定一个UUID (GUID)转换后的种子(散列?但可能不仅仅是演员阵容)到很长。

其他答案建议使用nanoTime,这可能适合于硬件的速度,但我更喜欢UUID路由。

票数 7
EN

Stack Overflow用户

发布于 2013-02-11 09:48:35

您可以使用System.nanoTime(),这将降低两个线程具有相同种子的可能性。

或者创建一个线程安全的实用程序类来为您获取随机数对象,同时确保它为每个新实例使用不同的种子。

此外,还可以为每个线程分配一个数字id作为线程名,并将其附加到种子

票数 1
EN

Stack Overflow用户

发布于 2013-02-18 05:45:23

您可以使用SecureRandom为两个随机数生成器生成种子。它使用服务提供商基础设施,可以使用特定于平台的熵源,因此在可用的系统上,您可能会从/dev/random获得熵,而不必担心代码中的熵。another answer中提到的UUID就是从这样的源生成的,至少是in OpenJDK 7.6

也就是说,请注意,从Java7开始,在多线程中使用PRNG的首选方式是ThreadLocalRandom。我不确定,但在我看来,这里的主要目标是避免同步开销,而不是种子问题。至少在OpenJDK 7.6中,constructor使用default Random constructor,它反过来使用高分辨率系统时间(以纳秒为单位,但不一定与实际分辨率相结合),并结合静态变量的当前值。后者确保即使在系统时钟的同一时间内创建的实例的种子也不同,所以即使使用默认构造函数简单地构建Random实例,您的原始问题也应该不存在了。

这种独特性是在2010年的introduced,作为对bug report #6937857的回应。该报告针对Java7进行了报告,也在Java7中进行了修复,但根据mercurial存储库的说法,此更改应该首先包含在jdk7-b94 release中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14804808

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档