使用.toCharArray()加扰字符串

时间:2012-04-27 03:58:01

标签: java

我的问题是我试图通过使用Random()和.toCharArray()将(例如)字符串“asdf”更改为“sdfa”。

如何获得重复的随机数?

我认为我应该创建一个新的Char数组,以便在不更改原始数组的情况下随机存储char,因为如果我这样做,那么新字符串将被搞砸,如果这有意义的话。

我在这段代码中没有这样做,但这可能是另一种选择???

编辑:我已经把它变成了一个主类,这应该会让它变得更容易。谢谢。

import java.util.Random;


public class Scramble {

public static void main(String[] args) {

            String str = "asdf";

            Random randomGenerator = new Random();

            int lengthOfStr = str.length();

            char[] chars = str.toCharArray();



            // do for length of str
            for (int i=0; i < lengthOfStr; i++)
            {

            int n = randomGenerator.nextInt(lengthOfStr);

            chars[i] = chars[n];

            String newStr = new String(chars);
            str = newStr;
            }

            System.out.println(str);            
}

}

3 个答案:

答案 0 :(得分:3)

查找Fisher-Yates shuffle以了解如何正确随机加扰数组。 (顺便说一句,该算法非常适合Java的随机数生成器为您提供随机数,并且不需要使您的随机数唯一。)

答案 1 :(得分:1)

关于您的第一个问题,您可以通过使随机数生成器成为您的类的成员而避免(在很大程度上)重复的随机数,而不是方法中的局部变量。以下代码应生成相当随机的加扰字分布。您可以将其长度归咎于缺少可用于原始数组的shuffle方法。根据您的需要进行调整:

public class Flipper {
   Random randomGenerator = new Random();

   public static void main(String[] args) {
      final String sample = "Hello World";

      final Flipper flipper = new Flipper();
      for (int i = 0; i < 100; i++) {
         System.out.println(flipper.scramble(sample));
      }
   }

   public String scramble(String str) {
      if (str == null)
         return null;

      char[] arr = str.toCharArray();
      List<Character> charList = new ArrayList<Character>(arr.length);
      for (final char c : arr) {
         charList.add(c);
      }

      Collections.shuffle(charList, randomGenerator);
      char[] converted = new char[charList.size()];
      for (int i = 0; i < charList.size(); i++) {
         converted[i] = charList.get(i).charValue();
      }

      return new String(converted);
   }
}

答案 2 :(得分:1)

这是一个具有O(n)持续时间顺序的简单的。循环只有3条指令: 它将随机字符串附加到新字符串中并将其从原始字符串中删除,因此当获得下一个随机字符时,先前获得的字符不符合条件。 在写完这个函数之后我注意到它似乎是Fisher-Yates shuffle算法的一种形式。

public class Scramble {

    public static String scramble(String str) {   
        StringBuilder newStringBuilder = new StringBuilder();
        StringBuilder stringBuilder = new StringBuilder(str);

        while (stringBuilder.length() > 0) {
            int n = (int)(Math.random() * stringBuilder.length()));
            newStringBuilder.append(stringBuilder.charAt(n));
            stringBuilder.deleteCharAt(n);
        }

        return newStringBuilder.toString();
    }

    public static void main(String[] args) {
        System.out.println(scramble("hola"));
    }
}
相关问题