Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.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 洗牌随机数组_Java_Arrays_Shuffle - Fatal编程技术网

Java 洗牌随机数组

Java 洗牌随机数组,java,arrays,shuffle,Java,Arrays,Shuffle,正在寻找有关java中洗牌和密码问题的帮助 首先,我尝试随机洗牌一个数组,但在洗牌后的数组中我一直得到2个相同的值 代码如下:) publicstaticvoidshuffle(char[]characterArray){ 随机发生器=新随机(12345); 对于(int i=0;i使用Random并不会阻止一个条目被多次选择。如果您希望简单地随机化数组的顺序,那么最好生成一个新数组,用旧数组中的条目填充它-一次从旧数组中删除一个条目以创建新的条目 由于数组大小在Java中是不可变的,所以您可能

正在寻找有关java中洗牌和密码问题的帮助

首先,我尝试随机洗牌一个数组,但在洗牌后的数组中我一直得到2个相同的值

代码如下:)

publicstaticvoidshuffle(char[]characterArray){
随机发生器=新随机(12345);

对于(int i=0;i使用Random并不会阻止一个条目被多次选择。如果您希望简单地随机化数组的顺序,那么最好生成一个新数组,用旧数组中的条目填充它-一次从旧数组中删除一个条目以创建新的条目

由于数组大小在Java中是不可变的,所以您可能需要使用一些附加的或备用的数据结构来跟踪已返回的条目

可用于实现此目的的许多方法都可以在-complete中找到,并附带源代码

您可以尝试以下方法:

public static void shuffle(char[] characterArray){
    final List<Character> charList = new ArrayList<>(characterArray.length);
    for(final char c : characterArray){
        charList.add(c);
    }
    Collections.shuffle(charList);

    for(final char c : charList){
        System.out.print(c);
    }
}
现在,如果您在这里寻找不可预测的输出,我不会使用具有常量值的单参数随机构造函数


或者,您也可以按照上述建议,在不调用
集合的情况下自己执行类似操作。shuffle
。查看
集合的源代码。shuffle
您自己也可以进行教育。

对数组进行洗牌的标准算法是,也称为“算法p”除非你有充分的理由不使用它,否则请使用Fisher-Yates


如果您正在考虑加密使用,那么您需要使用加密安全的随机数生成器,如Java的
SecureRandom
。不要使用标准的不安全RNG,它在统计上很好,但在加密方面非常不安全。

对不起,我想我不明白您想说什么。您会怎么做实现您在对我的代码的评论中标记的解决方案?@Jenna-请查看我刚才添加到答案中的示例。太棒了!但是,如果我告诉您我必须使用随机类来实现它,会怎么样?如果我们考虑到该约束,您的示例代码会发生什么变化?:) thx@Jenna-这是家庭作业吗?不管怎样,请查看答案的更新。您还可以制作一个比较器,比较两个随机值生成器bij de
random
class。然后执行
Collection.sort(数组,随机比较器)
。但是
集合。shuffle
是标准解决方案。@martijnn2008否。比较器必须一致。它不能返回随机值。@jbnize为什么它不起作用呢?你可以制作一个标准比较器,但不是比较两个值,而是比较两个新生成的随机值。因此,请说“我不明白”您的解决方案是“而不是”它是不可能的“。它不会起作用,因为它会破坏比较程序关于哪个排序()的契约依赖。排序算法可以检测到它并抛出异常。它也不能检测到它并进入无限循环。任何事情都可能发生,因为你违反了前提条件。我从来没有说过这是不可能的,我确实理解你的解决方案。顺便说一句,排序的javadoc说:IllegalArgumentException-(可选)如果发现比较器违反了比较器契约。@JBNizet ok感谢您解释了您的第一条评论。
public static void shuffle(char[] characterArray){
    final List<Character> charList = new ArrayList<>(characterArray.length);
    for(final char c : characterArray){
        charList.add(c);
    }
    Collections.shuffle(charList);

    for(final char c : charList){
        System.out.print(c);
    }
}
public static void shuffle(char[] characterArray){
    final Random generator = new Random(12345);

    final List<Character> charList = new ArrayList<>(characterArray.length);
    for(final char c : characterArray){
        charList.add(c);
    }
    Collections.shuffle(charList, generator);

    for(final char c : charList){
        System.out.print(c);
    }
}