случайное генерирование символа в строке - PullRequest
3 голосов
/ 23 августа 2010

Мне нужно генерировать случайный символ в строке Java, когда пользователь нажимает кнопку.например: если мы возьмем пример с кошкой, мне нужно отобразить символ в строке, например:*

Ответы [ 2 ]

7 голосов
/ 23 августа 2010

по алгоритму тасования Фишера-Йейтса

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" ( см. Также на ideone.com ).


Альтернативное решение Guava + Java Collections Framework

Если у вас установлена ​​ библиотека Guava , то это было бы хорошим решением. Вот ключевые факты:

  • Guava имеет Chars.asList(char...), который создает List<Character> live view из char[]. Изменения в возвращаемом списке будут влиять на резервный массив (и наоборот).
  • java.util.Collections банка shuffle(List<?>)

Затем мы можем объединить эти два кода, чтобы получить следующий чистый и читаемый код:

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));
        }
    }
}

Выше будет напечатано 10 анаграмм "stackoverflow".

Обратите внимание, что Гуава используется только для обеспечения List<Character> просмотра в реальном времени из char[]. char[] не получает автоматическую коробку с Character[] (и наоборот), в противном случае Arrays.asList(T...) было бы достаточно.

Смотри также

Похожие вопросы

1 голос
/ 23 августа 2010

Привет, спасибо за все, наконец, я получил решение для моей проблемы.

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;

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...