唯一随机数生成

4

我正在寻找一种使用Java基于当前时间生成唯一随机数的方法。我是一名C++程序员,在C++中,我通常使用时间来初始化随机数生成器,以便在每个特定时刻可以获得唯一的随机数,具体操作如下:

sRand((time)Null);
x=Rand();

在Java中,我发现可以通过使用时间作为随机数的种子来使用相同的方法,如下所示:
Random rand = new Random(System.currentTimeMillis());

我遇到一个问题,我在网络上找到了所有生成Java随机数的方法,但它们都不是真正的随机数,并且范围从负数到正数不等。例如:

Random rand = new Random(System.currentTimeMillis());
int x=rand.nextInt(); // or long or float ...

我得到的是一系列并非真正随机的数字,并且结果与C++中的结果非常不同。

我想知道在Java中实现这个功能的最佳方式是什么,是否有类似或非常接近TAC号码生成的方法。


1
“真正随机”是什么意思?获得伪随机数不是唯一可能的吗?至于负数,您可以将int作为参数传递给nextInt(),结果将范围从0到n-1(n是传递的值)。 - toniedzwiedz
2
如果它们是真正的随机数,它们将不会是唯一的。我相信你正在寻找的是GUID,这是完全不同的东西。 - James Youngman
2
一个合适的随机数生成器 应该 多次生成相同的数字。如果你想要唯一的数字,可以打乱一个数组中的数字以随机选择,并按顺序返回它们。 - Louis Wasserman
1
我不确定你是否理解。如果C++随机数生成器被_正确实现,_那么C++代码有时会给出相同的结果。并非每次都是相同的结果,但有时会是相同的结果。是什么让你认为它返回唯一值? - Louis Wasserman
1
你在Java程序的过程中多次重新初始化随机种子了吗?你能提供一个演示该模式的程序吗?请注意,你正在使用64位种子来生成32位值;根据生日悖论,如果你生成100000个随机的32位值,你很可能会看到至少一个重复值。 - Louis Wasserman
显示剩余12条评论
2个回答

8
Java和C++的随机数都是伪随机。当然,算法不同,结果也不同。
如果您想要一个足够强大的随机数生成器用于密码学,可以使用SecureRandom:它的界面不够直观,而且消耗更多的CPU,但其输出的质量比Java常规PRNG高得多。

我知道SecureRandom库,但出于某些原因,我不想使用任何库来完成它。 - Loop Masters
我只想知道如何自己生成安全随机数。 - Loop Masters
4
你几乎肯定不应该这样做。 SecureRandom 已经内置于Java中,它几乎肯定比你、我或几乎任何 StackOverflow 上的其他人编写的任何随机数生成器都设计得更好。 - Louis Wasserman

0
如果你想生成一个随机数,最简单的方法是使用 new Random().nextInt(),或许可以用 Math.abs() 包装一下以避免负数。如果你需要一个唯一的数字,可以使用 UUID.randomUUID()。

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