0

我的问题是我试图通过使用 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);            
}

}

4

3 回答 3

3

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

于 2012-04-27T04:05:42.373 回答
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);
   }
}
于 2012-04-27T04:22:48.657 回答
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"));
    }
}
于 2012-04-27T04:45:40.143 回答