我正在创建一个程序,它将输出一个字符串的字母,但是已经乱码了。它有效,但没有办法阻止一封信出现多次。我该怎么做呢?
我的代码:
import java.util.Random;
public class Final {
public static void main(String[] args) {
Random rand = new Random();
String str = "pumpkinpie";
String[] split = str.split("");
for(int i = 0; i < split.length; i++){
int randomLet = rand.nextInt(split.length);
System.out.print(split[randomLet]);
}
}
}
答案 0 :(得分:5)
您可以将String中的每个字符添加到ArrayList中,并使用Collections.shuffle()方法对其进行随机播放,该方法也接受Random实例:
//1. initiate the string you want to shuffle
String originalString = "pumkinpie";
//2. initiate a List into which the characters will be added
List<Character> characterList= new ArrayList<Character>();
//3. add each character from the String to the List
for (char character : originalString.toCharArray()) {
characterList.add(character);
};
//4. shuffle using Collections.shuffle
Collections.shuffle(characterList, new Random());
//5. print each character
for (Character character : characterList) {
System.out.println(character);
}
答案 1 :(得分:0)
将字母添加到数组/ Set
/ List
,仅在数组/ Set
/ List
不包含字母时打印:
Set<String>...
for(int i = 0; i < split.length; i++){
int randomLet = rand.nextInt(split.length);
if(set does not contain split[randomLet]){
System.out.print(split[randomLet]);
add split[randomLet] to set
}
}
答案 2 :(得分:0)
主要是概念性答案
如果您正在尝试随机化字符串,那么请认识到,放置字母不能重复的逻辑过滤器实际上会降低熵,从而出于任何目的降低安全性或基本随机性。此外,这将非常困难,因为如果检测到重复,则需要重新加扰。
以例如:
randomize "add" - characters as 123
a - 1
ad - 13
add - 132
! back to drawing block
作为一个人,我们知道只有一个非重复的字符串可以来自爸爸(字符顺序为312和213),但是系统会点击每个选项,直到它击中其中一个,每次都开始...
add > add > dad > dad > dda > dda
123 > 132 > 213 > 312 > 321 > 231
或像sorry
这样的字:
有120种排列,其中有8种不同的方式,其中第3和第4个字母以rr
或34
方式(2种方式和4种位置)重复(43
)结果字符串)。在120种可能性中,这占了48种排列,其中许多排列直到许多字符才被发现。
在具有更多重复字符的单词中(例如comodo
,具有6个不同的o
双精度数,这涵盖了可能720的576种排列),您会遇到脚本变得非常低效的情况由于挣扎......
但是,如果你需要这个,你最好的选择是编写一个随机化一个单词的函数,检查,然后再次随机化。手工操作(一次一个字符)对于更容易的单词来说会慢一些,而且对于麻烦的单词,你将获得与其他任何东西一样多的运气。让幸运女神引导你......
答案 3 :(得分:0)
如果OP只想加扰而不想删除任何字符。
换句话说,pmieupnpki
是有效的输出
然后,
而不是盲目地随机交换该数组中的元素。因为小范围内的随机可能是相同的。
Random rand = new Random();
String str = "pumpkinpie";
char[] split = str.toCharArray();
for(int i = 0; i < str.length(); i++){
int randomLet = rand.nextInt(split.length);
char c = split[randomLet];
split[randomLet] = split[i];
split[i] = c;
}
System.out.println(String.valueOf(split));