我正在制作一款将在Android和PC上播放的网络纸牌游戏。
要在游戏开始之前处理诸如洗牌之类的东西并选择谁先进行(以及其他类似的事情),我想使用java.util.Random并在服务器和所有客户端上设置种子是相同的(由服务器生成)。
这似乎是最简单的方法,比发送包含服务器洗牌的所有52张卡的序列的长消息更有效
这是否可以指望总是在不同类型的JVM / JRE等上从同一种子生成相同的数字(我主要考虑Android的各种版本以及Android和其他人使用的不同版本的dalvik JVM事情),或者我应该在服务器上洗牌并将卡列表发送给所有玩家? (或者除了java.util.Random之外还有什么我可以使用的吗?)
答案 0 :(得分:1)
根据javadoc,所有实现都必须相同。
Java实现必须使用此处显示的所有算法 class Random,为了Java代码的绝对可移植性。
http://docs.oracle.com/javase/6/docs/api/java/util/Random.html
答案 1 :(得分:1)
由于标准的javadoc声明Random在所有平台中的行为必须相同,所以你应该相信它。不过,您可以让Random appart和编码您自己的算法来生成伪随机数:例如:想象一下基于SINE的函数:
double myRandom = amplitude * Math.sin(frequency * sequence)
...其中幅度是编号间隔(52)的上限,频率应该是高常数值,不是PI的倍数。并且序列应该以恒定的偏移值开始,并在每次获得新的随机值时递增。
准确选择频率值,您还可以确保算法不会在一定次数的迭代中产生重复值。