如何在不使用java中的随机类的情况下随机生成1到1000的no?

时间:2011-02-14 12:33:02

标签: java

我希望使用一些数学公式随机生成从1到1000的数组位置,并且在Java中没有java.util.Random类。我想在客户端和服务器端生成相同的随机序列。我怎么能这样做?

4 个答案:

答案 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频道)。

如果您希望服务器和客户端独立计算这个数字,那么:

  1. 根据定义,它并不是随机的;和
  2. 它必须依赖于其他一些输入才能重复(例如特定文件的MD5哈希值)
  3. 您希望通过此并行计算获得什么,而不仅仅是传输一个保证匹配的数字?

答案 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