-1

这段代码显然是一个随机数生成器,但我如何以最简单的方式让它成为唯一的呢?

import java.util.Random;


public class Scramble {

public static void main(String[] args) {

            for (int i=0; i < 10; i++)
            {

            Random randomGenerator = new Random();
            int n = randomGenerator.nextInt(10);

            System.out.println("Random number is " +n);
            }

      }

}
4

5 回答 5

6

对于这少数可能的值:

  1. 生成所有可能值的列表
  2. 随机播放
  3. 在每一步中返回下一项
于 2012-04-27T05:27:51.683 回答
2

最大长度LFSR(例如PRBS序列)是否适合?

例如,PRBS31 序列 (x 31 +x 28 +1) 保证每个 31 位整数(0 除外)在一个周期内仅生成一次(即 2 31 -1 位长)

它也很容易实现:

public int prbs31(int state) {
    int feedback = ((state >> 30) ^ (state >> 27)) & 1;
    return ((state << 1) | feedback) & 0xffffffff;
}

您从一些(非零!)整数开始,然后prbs31连续调用 - 将先前的结果传回。(它是一个反馈寄存器!)

PRBS31 生成非常好的统计随机位模式(不要与真正的随机位模式混淆)

但是,请记住相邻值将非常相似 - 上面建议的方法在 PRBS 序列上执行一位滑动窗口,这意味着每个相邻值都有 30 位共同(尽管在不同的地方)

但是我们可以每次将寄存器推进 31 步,如下所示:

// initial seed, doesn't really matter which value you use
// as long as it's not zero (remember that the sequence goes over
// all the possible 31-bits values anyway)
private static final int SEED = 0x55555555;

private int state = SEED;

public int nextInt() throws SequenceCycleException {
    for (int i = 0; i < 31; ++i) {
        state = prbs31(state);
        if (state == SEED) {
            throw new SequenceCycleException();
        }
    }
    return state;
}

这将生成一个看起来随机的整数序列,长度为 (2 31 -1)/31

免责声明:单个 LFSR 的幼稚使用是高度可预测的。在这种情况下,知道一个值就可以知道所有未来的值——这使得这种方法对模拟(例如游戏)非常有用,但对于任何具有密码或秘密意义的东西也非常不利!

就个人而言,我使用这种方法为在哈希表中用作键的对象生成唯一 ID。

于 2013-02-17T15:33:12.407 回答
0

The simplest way possible is to use clock arithmetic. If you add by a number which is not a factor of 10 e.g. a prime (and the difference is not factor as well) you will get every possible value in a random walk. It not very random, but it is very simple.

e.g. say you pick 3 for 10 values.

3, 6, 9, 2, 5, 8, 1, 4, 7, 0
于 2012-04-27T05:40:16.973 回答
0

您可以生成一个随机数,将其存储在Array// HashMapWhatever 中并返回它。然后,您只需每次检查新号码是否已经在您保存的旧号码中。效率不是很高,但很容易。

于 2012-04-27T05:47:55.483 回答
-2

这是随机数(整数)生成的代码示例。我们知道它Math.random()总是返回 double 类型的值。所以,我把它转换成int。

class RNumber{
    public static void main(String str[]){
        int countNum=100;   
        for(int i=0;i<countNum;i++){
            System.out.println("Random Unique values="+(int)(Math.random()*100));
        }
    }
}

希望,它会帮助你。

于 2012-04-27T05:43:37.400 回答