基于种子的伪随机序列发生器

时间:2017-01-08 03:05:23

标签: java

我设法根据种子做出随机序列,但现在我正在尝试别的东西。基本上,它生成一个数字(基于种子),然后检查该数字是否已经在数组中,然后如果它不在数组中,则将其添加到数组中,如果是,则进行到下一个。但是,我的程序工作正常,直到它达到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]);
    }
}

3 个答案:

答案 0 :(得分:1)

将问题分解为部分,首先是在valueletters之间的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;
}

然后,fill int[]方法Random提供length给定int[]的方法。由于您希望do while是唯一的,因此您可以使用内部private static int[] fill(Random rnd1, int length) { int[] letters = new int[length]; for (int i = 0; i < length; i++) { int c; do { c = rnd1.nextInt(length); } while (match(letters, i, c)); letters[i] = c; } return letters; } 循环,而下一个符号已经存在。像,

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)); } )输出数组,如

attr

答案 1 :(得分:0)

两个快速修复:

1)for循环上升到索引25,即ArrayIndexOutOfBoundsException,因为数组长度为25。

for(int i = 0; i < 25; i++) 
//Your code
 }

2)将此代码替换为满足条件的内容,并生成新的随机数,然后将其分配给数组。

if (letters[x] == c) {
    isSame = true;
}

答案 2 :(得分:0)

看起来你想要将数字0-25混乱,也就是说,将每个数字恰好存储一次,但是在数组中的随机位置。这也称为生成随机排列。假设是这种情况,那么您的代码有两个问题:

    当您选择一个新的随机数时,
  1. isSame需要设置为false,否则一旦重复一个数字,isSame对于所有后续数字都为真,并且没有任何新内容写入阵列

  2. 当选择已经在数组中的随机数时(当发现isSame为真时),需要为该索引找到一个新数字。在您的代码中,将跳过该索引,并且该索引处的值将默认为0.

  3. 也许值得一提的是,针对这个问题有更有效的算法。这种方法将继续挑选大量随机数,然后丢弃,这是浪费。 Fisher-Yates shuffle解决了这个问题(来自维基百科的伪代码):

    for i from 0 to n−2 do
         j ← random integer such that i ≤ j < n
         exchange a[i] and a[j]