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