我希望使用一些数学公式随机生成从1到1000的数组位置,并且在Java中没有java.util.Random
类。我想在客户端和服务器端生成相同的随机序列。我怎么能这样做?
答案 0 :(得分:2)
如果您的实际要求是“客户端和服务器上的相同随机系列”,则可以使用具有完全相同的初始种子的Random。
实际上,java Random使用数学公式,并不是真正的随机。
示例:
Random client = new Random(12345);
Random server = new Random(12345);
for (int i = 0; i < 100; i++) {
assert client.nextInt() == server.nextInt();
}
答案 1 :(得分:1)
好吧,如果不使用Random类,您可以使用当前时间生成一个随机数,然后将其恢复到1-1000范围内。像(原油,但嘿......):
long time = System.currentTimeMillis();
long rand = time % 1000;
编辑:没有看到“客户端和服务器上的相同”部分......然后上面使用带有给定初始种子的随机类的Splix的答案似乎确实是要走的路。
答案 2 :(得分:0)
如果客户端和服务器可能与其他任何一方通信,那么实现这一点的最简单方法就是让服务器以通常的方式生成一个随机数,然后安全地将这个随机数发送给客户端(例如通过HTTPS频道)。
如果您希望服务器和客户端独立计算这个数字,那么:
答案 3 :(得分:0)
您可以尝试以下简单的模数随机数。
public class SimpleRandom {
private long seed;
public SimpleRandom(long seed) {
this.seed = seed;
}
public int nextInt(int n) {
seed += 1111211111;
return (int) ((seed >>> 8) % n);
}
public static void main(String... args) {
SimpleRandom sr = new SimpleRandom(0);
SortedSet<Integer> ints = new TreeSet<Integer>();
while(ints.size() != 1000) {
for(int i=0;i<500;i++)
ints.add(sr.nextInt(1000));
System.out.println("min: "+ints.first()+" max: "+ints.last()+" count: "+ints.size());
}
}
}
打印
min: 1 max: 998 count: 500
min: 1 max: 999 count: 682
min: 1 max: 999 count: 807
min: 0 max: 999 count: 925
min: 0 max: 999 count: 1000