首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于种子的伪随机序列发生器

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

Stack Overflow用户
提问于 2017-01-08 11:05:23
回答 3查看 90关注 0票数 0

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

代码语言:javascript
复制
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]);
    }
}
EN

回答 3

Stack Overflow用户

发布于 2017-01-08 11:19:31

将问题分成几部分,首先使用一个方法在索引0p之间测试letters中的value,如下所示

代码语言:javascript
复制
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;
}

然后提供一种方法,将具有提供的Randomint[] fill到给定的length。由于您希望int[]是唯一的,因此可以在下一个符号已经存在的情况下使用内部do while循环。喜欢,

代码语言:javascript
复制
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;
}

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2017-01-08 11:22:36

两个快速修复方法:

1)由于您的数组的长度为25,因此for循环将上升到索引25,该索引为ArrayIndexOutOfBoundsException。

代码语言:javascript
复制
for(int i = 0; i < 25; i++) 
//Your code
 }

2)将此代码替换为满足条件的代码,并生成一个新的随机数,然后将其赋值给array。

代码语言:javascript
复制
if (letters[x] == c) {
    isSame = true;
}
票数 0
EN

Stack Overflow用户

发布于 2017-01-08 11:31:30

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

当您挑选一个新的随机数时,需要将

  1. isSame设置为false,否则一旦某个数字重复,则所有后续数字的isSame都为true,并且不会向数组中写入任何新的内容。
  2. 当挑选已存在于数组中的随机数时(当发现isSame为true时),需要为该索引找到一个新的数字。在您的代码中,将跳过该索引,并且该索引处的值默认为0。

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

代码语言:javascript
复制
for i from 0 to n−2 do
     j ← random integer such that i ≤ j < n
     exchange a[i] and a[j] 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41529041

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档