如何制作一个独特的随机数发生器?

时间:2012-04-27 05:24:36

标签: java

这段代码显然是一个随机数生成器,但是如何以最简单的方式使它独特?

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);
            }

      }

}

5 个答案:

答案 0 :(得分:6)

对于这个少数可能的值:

  1. 生成所有可能值的列表
  2. 随机播放
  3. 返回每个步骤中的下一个项目

答案 1 :(得分: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生成非常好的统计随机位模式(不要与truly random位模式混淆)

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

但我们可以每次推进寄存器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 long

免责声明:单个LFSR的天真使用具有高度可预测性。在这种情况下,知道一个值可以了解所有未来值 - 这使得此方法适用于模拟(例如游戏),但对于任何事情都非常糟糕加密或秘密意义!

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

答案 2 :(得分:0)

最简单的方法是使用时钟算法。 如果您添加的数字不是10的因子,例如素数(差异也不是因素)你将在随机游走中获得所有可能的价值。它不是很随意,但很简单。

e.g。假设您选择10个值为3。

3, 6, 9, 2, 5, 8, 1, 4, 7, 0

答案 3 :(得分:0)

您可以生成一个随机数,将其存储在Array / HashMap /无论如何并将其返回。然后,您每次都必须检查新号码是否已保存在旧号码中。 不是很有效但很容易。

答案 4 :(得分:-2)

这是随机数(整数)生成的代码示例。我们知道Math.random()总是返回双重类型值。所以,我把它转换成了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));
        }
    }
}

希望,它会对你有帮助。