随机生成字符串中的字符

时间:2010-08-23 04:57:21

标签: java permutation

当用户点击按钮时,我需要在String java中生成随机字符。 例如:如果我们采用cat示例,我需要在字符串中显示字符,如下所示:

CAT,ACT,TAC,TCA

提前致谢

阿斯旺

2 个答案:

答案 0 :(得分:7)

关于Fisher-Yates混洗算法

Fisher-Yates shuffle是改组的标准算法。这是伪代码:

To shuffle an array a of n elements:
   for i from n - 1 downto 0 do
         j ← random integer with 0 ≤ j ≤ i
         exchange a[j] and a[i]

这是一个简单的Java实现:

static String shuffled(String s) {
    char[] a = s.toCharArray();
    final int N = a.length;
    Random r = new Random();
    for (int i = N - 1; i >= 0; i--) {
        int j = r.nextInt(i + 1);
        swap(a, i, j);
    }
    return new String(a);
}
static void swap(char[] a, int i, int j) {
    char t = a[i];
    a[i] = a[j];
    a[j] = t;
}

然后你可以:

    String text = "stackoverflow";
    for (int i = 0; i < 10; i++) {
        System.out.println(shuffled(text));
    }

这将生成10个字符串"stackoverflow"see also on ideone.com)的混洗。


Guava + Java Collections Framework替代解决方案

如果您安装了Guava library,那么这将是一个不错的解决方案。以下是关键事实:

然后我们可以将两者合并以获得以下干净且可读的代码:

char[]

以上将打印10个import com.google.common.primitives.*; import java.util.*; public class AnagramCreator { public static void main(String[] args) { String text = "stackoverflow"; char[] arr = text.toCharArray(); List<Character> list = Chars.asList(arr); for (int i = 0; i < 10; i++) { Collections.shuffle(list); System.out.println(new String(arr)); } } } 的字谜。

请注意,Guava仅用于提供"stackoverflow"的{​​{1}} 实时视图List<Character>不会自动生成char[](反之亦然),否则char[]就足够了。

另见

相关问题

答案 1 :(得分:1)

嗨,谢谢所有人终于为我的问题找到了解决方案。

public String RandomString(String word){

    int no=word.length();
    String temp="";
    String temp2=null;
     while(no>0){
         int genNo=ran.nextInt(word.length());
         if(temp2==null){
             temp2=""+genNo;
             temp=Character.toString(word.charAt(genNo));
             no--;
         }else{
            if(!temp2.contains(""+genNo)){
                temp2=temp2+""+genNo;
                temp=temp+Character.toString(word.charAt(genNo));
                no--;
            }
         }
     }

    if(!temp.equals(word)){
         Log.v("check","temp2 = "+temp2);
         Log.v("check","String = "+temp);
        return temp;
    }else{
        RandomGenerate(word);
    }
    return null;

}