【发布时间】:2012-08-30 05:50:11
【问题描述】:
我发现使用 Java 的 Random 类生成随机数时有些奇怪。 基本上,如果您使用紧密种子(例如 1 到 1000 之间)创建多个 Random 对象,每个生成器生成的第一个值几乎相同,但下一个值看起来很好(我没有进一步搜索)。
这里是种子从 0 到 9 的两个最先生成的双打:
- 0 0.730967787376657 0.24053641567148587
- 1 0.7308781907032909 0.41008081149220166
- 2 0.7311469360199058 0.9014476240300544
- 3 0.731057369148862 0.07099203475193139
- 4 0.7306094602878371 0.9187140138555101
- 5 0.730519863614471 0.08825840967622589
- 6 0.7307886238322471 0.5796252073129174
- 7 0.7306990420600421 0.7491696031336331
- 8 0.7302511331990172 0.5968915822372118
- 9 0.7301615514268123 0.7664359929590888
从 991 到 1000:
- 991 0.7142160704801332 0.9453385235522973
- 992 0.7109015598097105 0.21848118381994108
- 993 0.7108119780375055 0.38802559454181795
- 994 0.7110807233541204 0.8793923921785096
- 995 0.7109911564830766 0.048936787999225295
- 996 0.7105432327208906 0.896658767102804
- 997 0.7104536509486856 0.0662031629235198
- 998 0.7107223962653005 0.5575699754613725
- 999 0.7106328293942568 0.7271143712820883
- 1000 0.7101849056320707 0.574836350385667
这是一个显示从 0 到 100,000 的种子生成的第一个值的图。
基于种子生成的第一个随机双精度:
我搜索了有关此问题的信息,但没有看到任何与此确切问题相关的信息。我知道 LCG 算法存在很多问题,但我不知道这个问题,我想知道这是否是一个已知问题。
另外,您是否知道这个问题是否只针对第一个值(或前几个值),或者是否更普遍并且应该避免使用紧密种子?
谢谢。
【问题讨论】:
-
C++ 和 Java 都有标准的伪随机生成器。伪-->不是完全随机的。
-
我认为使用种子通常会降低随机性。您应该尝试使您的种子尽可能随机,最好不要使用任何种子。 ;) 许多 SecureRandom 实现忽略了提供的种子。
-
随机函数有很多
-
您知道“种子”的作用吗?这不是一个散列函数,不要期望使用稍微不同的种子同时得到完全不同的结果。
-
您可能会觉得这很有趣。 vanillajava.blogspot.co.uk/2011/10/randomly-no-so-random.html如果你想使用种子,你需要小心你使用的那些。注意:Random 仅使用 48 位种子,因此不会生成所有可能的
long或double。