Java 如何制作唯一的随机数生成器?

Java 如何制作唯一的随机数生成器?,java,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

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

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

      }

}
import java.util.Random;
公共类争用{
公共静态void main(字符串[]args){
对于(int i=0;i<10;i++)
{
Random randomGenerator=新的Random();
int n=randomGenerator.nextInt(10);
System.out.println(“随机数为”+n);
}
}
}

对于这一小部分可能的值:

  • 生成所有可能值的列表
  • 洗牌
  • 返回每个步骤中的下一项

  • 最简单的方法是使用时钟算法。 如果你加上一个不是10的因子的数字,例如一个素数(差也不是因子),你将在随机游动中得到每一个可能的值。它不是很随机,但很简单

    e、 假设你从10个值中选择3个

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

    这是生成随机数(整数)的代码示例。因为我们知道
    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));
            }
        }
    }
    
    类编号{
    公共静态void main(字符串str[]){
    int countNum=100;
    
    对于(int i=0;i您可以生成一个随机数,将其存储在
    数组中
    /
    HashMap
    /无论什么,然后返回它。然后您只需每次检查新数字是否已存在于保存的旧数字中。 不是很有效,但很容易。

    最大长度(如序列)适合吗

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

    实施起来也相当容易:

    public int prbs31(int state) {
        int feedback = ((state >> 30) ^ (state >> 27)) & 1;
        return ((state << 1) | feedback) & 0xffffffff;
    }
    
    这将生成一个看似随机的整数序列,长度为(231-1)/31

    免责声明:简单地使用单个LFSR是高度可预测的。在这种情况下,知道一个值就可以知道所有未来的值-这使得这种方法适用于模拟(如游戏),但也不适用于任何具有加密或秘密意义的东西


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

    当你说“洗牌”时,你是指“集合”。洗牌?我不能使用此方法,因为它太高级了。实际上,没有任何更简单的解决方案。当你有一个可以高达1000000的随机数时,这不太实际,但你需要t 5 unique numbers.brice,因此在我的答案的第一行中有限制。还要注意,这个问题没有要求100万个数字中的5个。这对选择唯一元素没有任何帮助。当你只需要一个基本的伪随机数时,例如散列图的移动箱。(如果你不使用列表)对不起,我认为这个问题和我的答案一样:PIs这个随机数有用吗?当你只需要一个基本的伪随机数时,比如散列图的移动垃圾箱。(如果你不使用列表)好处是,你不需要保留任何数据结构或状态,除了你正在查看的点(例如散列)。你需要理解“唯一”和“随机”是相互矛盾的。你收集的序列中的数字越多,就越容易预测下一个,因此序列远离“随机”。使用List/Map/WhateverInterface而不是Array/HashMap/WhateVeri实现。
    // 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;
    }