Java随机序列

时间:2014-02-27 05:35:56

标签: java random bit-manipulation sequence

让我尽力解释我的问题,好吧,说我们有一个用特定种子构建的Random类。此时,我们可以使用.next()方法获取从种子派生的下一个值。

我似乎需要一种从这个序列中获取值的方法,但不是按顺序。例如,如果Random有一个类似.get(X)的方法,它将返回.next()的第X次调用的值。

我能想到的一种方法是使用for循环X次,在每个循环中调用.next()但不分配变量。由于A. performance和B.它将随机序列保留为X,这意味着如果你的下一个X小于原始X,你将不得不重建Random

这是我想到解决这个问题的另一种方式。也许您可以从旧种子和X派生临时新种子,一次调用next()并存储该值,然后将Random返回到其原始种子。我不知道从两个值中获取这个新种子的典型方法,可能是一些疯狂的按位操作。我对这种方法的所有实验都没有足够随机。

好的,谢谢你的帮助!

2 个答案:

答案 0 :(得分:4)

您可以为Random对象创建缓存。我的意思是创建一个最初为空的ArrayList。然后创建使用ArrayList和Random对象的get(X)方法。调用get(X)时,可以调用Random的next()方法X次,并将它生成的X值写入ArrayList。然后返回最后一个值。

下次使用参数Y调用get()时,将Y与ArrayList的长度进行比较。如果它小于列表的长度(Y小于X),那么您之前已经计算了该值,并且可以在ArrayList中查找并返回它。如果Y大于列表的长度,那么通过调用Random的next()方法足够长的时间来增长ArrayList。

你需要一些记忆,但它会让你回去,而且你的跑步时间会和你见过的最大X一样慢。

答案 1 :(得分:-2)

我的一位朋友曾告诉我,我们在计算机中确实没有随机值,因为任何随机值生成方法都将基于逻辑算法。

import java.util.Random;

Random random = new Random(System.currentTimeMillis());

// Example
int randomInt = random.nextInt(500); [Returns value between 0(inclusive) and 500 (exclusive)]
And so goes the other methods.

由于时间不重复,调用System.currentTimeMillis()并将其作为随机种子传递将是您最好的选择。最常见的是这样做。

无论你使用什么算法,无论如何,你仍然会得到一个伪随机数 您必须观察物理过程才能获得真正随机的数字。