Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 基于seed的伪随机序列发生器_Java - Fatal编程技术网

Java 基于seed的伪随机序列发生器

Java 基于seed的伪随机序列发生器,java,Java,我设法根据一个种子制作了一个随机序列,但现在我正在尝试其他方法。基本上,它生成一个数字(基于种子),然后检查该数字是否已在数组中,如果不在数组中,则将其添加到数组中,如果是,则继续下一个。然而,我的程序运行良好,直到它达到0,然后它只是不断重复0。这是我的密码: public static void main(String[] args) { Scanner s = new Scanner(System.in); System.out.println("Enter a seed(

我设法根据一个种子制作了一个随机序列,但现在我正在尝试其他方法。基本上,它生成一个数字(基于种子),然后检查该数字是否已在数组中,如果不在数组中,则将其添加到数组中,如果是,则继续下一个。然而,我的程序运行良好,直到它达到0,然后它只是不断重复0。这是我的密码:

public static void main(String[] args) {
    Scanner s = new Scanner(System.in);
    System.out.println("Enter a seed(One letter)");
    String input = s.nextLine();
    char a = input.charAt(0);
    int b = ((int) a) - 96;
    Random rnd1 = new Random(b);
    int[] letters = new int[25];
    boolean isSame = false;
    for(int i = 0; i < 26; i++)
    {   
        int c = rnd1.nextInt(26);
        for(int x = 0; x < i; x++)
        {
            if(letters[x] == c)
            {
                isSame = true;
            }
        }   
        if(isSame == false)
        {
            letters[i] = c;
        }
        System.out.println(letters[i]);
    }
}
publicstaticvoidmain(字符串[]args){
扫描仪s=新的扫描仪(System.in);
System.out.println(“输入种子(一个字母)”;
字符串输入=s.nextLine();
字符a=输入字符(0);
int b=((int)a)-96;
随机rnd1=新随机(b);
int[]字母=新int[25];
布尔值IsName=false;
对于(int i=0;i<26;i++)
{   
int c=rnd1.nextInt(26);
对于(int x=0;x
将问题分解为几个部分,首先是一种测试索引
0
p
之间
字母中的
值的方法

private static boolean match(int[] letters, int p, int val) {
    for (int i = 0; i < p; i++) {
        if (letters[i] == val) {
            return true;
        }
    }
    return false;
}
然后可以调用它(并且可以使用
Arrays.toString(int[])
)来输出数组,如下所示

public static void main(String[] args) {
    Scanner s = new Scanner(System.in);
    System.out.println("Enter a seed(One letter)");
    String input = s.nextLine();
    char a = input.charAt(0);
    int b = ((int) a) - 96;
    Random rnd1 = new Random(b);
    int[] letters = fill(rnd1, 26);
    System.out.println(Arrays.toString(letters));
}
两个快速解决方案:

1) for循环将上升到索引25,即ArrayIndexOutOfBoundsException,因为数组的长度为25。
看起来您想要将数字0-25洗牌,也就是说,将每个数字只存储一次,但存储在数组中的随机位置。这也称为生成随机排列。假设是这种情况,那么您的代码有两个问题:

  • 拾取新随机数时,
    isSame
    需要设置为false,否则一旦重复一个数,
    isSame
    对所有后续数都为true,并且不会向数组写入任何新内容

  • 当选取数组中已经存在的随机数时(当发现IsName为true时),需要为该索引找到一个新的数。在代码中,将跳过该索引,该索引处的值将默认为0

  • 也许还值得一提的是,有更有效的算法来解决这个问题。这种方法会不断选取大量随机数,然后将其丢弃,这是一种浪费。Fisher-Yates shuffle解决了这个问题(来自维基百科的伪代码):

    从0到n的i的
    −2做
    J← 随机整数,使我≤ j
    您想在这里实现什么?在多次重复之后,条件(IsName==false)看起来不是真的,因此它只是打印出分配给int数组的初始值,即0。我对方法和函数不是很在行。我还是不明白我做错了什么
    public static void main(String[] args) {
        Scanner s = new Scanner(System.in);
        System.out.println("Enter a seed(One letter)");
        String input = s.nextLine();
        char a = input.charAt(0);
        int b = ((int) a) - 96;
        Random rnd1 = new Random(b);
        int[] letters = fill(rnd1, 26);
        System.out.println(Arrays.toString(letters));
    }
    
    for(int i = 0; i < 25; i++) 
    //Your code
     }
    
    if (letters[x] == c) {
        isSame = true;
    }
    
    for i from 0 to n−2 do
         j ← random integer such that i ≤ j < n
         exchange a[i] and a[j]