2016-01-02 3 views
-3

Хотите создать случайно сгенерированный алфавит для шифрования замещения. Моя идея была чем-то вроде этого.Как создать случайный сгенерированный алфавит в Java

 char randomChar = (char) (97 + r.nextInt(25)); 

Однако это вызовет повторение букв. Переход через массив символов и наблюдение, если письмо уже присутствует, кажется неэффективным.

Редактировать: Я был слишком расплывчатым в моей просьбе и вижу это сейчас. Вот полный вопрос, который я пытаюсь решить. Алфавит должен также содержать символ кнопки пробела, например '' '.

Запишите программу Java, которая преобразует (пользователь вводит) обычный текст для шифрования текста с использованием шифрования замещения (в котором простые текстовые буквы произвольно назначаются для шифрования текстовых букв). Обратите внимание, что шифр замещения заменяет открытый текст шифровым текстом. Наиболее распространенные шифры замещения заменяют одиночные символы открытого текста с предопределенными одиночными символами шифрованного текста (например, символ простого текста «a» может быть заменен символом шифрованного текста «q», «b» может быть заменен на «x», 'c' на 'k' и т. д.). Каждый символ обычного текста должен быть заменен другим символом шифрованного текста. В качестве части вашего решения вы должны написать и использовать, по крайней мере, следующие функции/методы: (i) createCipher(), который определяет и возвращает отображение из обычного текста для шифрования текста. Каждый простой текстовый символ ('a' .. 'z', '') должен быть случайным образом назначен символом шифрованного текста;

+1

что "г" в этом? ваш случайный объект? –

+0

извинения, r - мой случайный генератор. Мне удалось придумать другую идею, сейчас я отправляю – RonanMacF

ответ

0

Я думал о решении, говорит, что решение работает, но эффективно ли оно?

public static char[] createCipher(char[] cipher) { 
    char[] cipher = new char[27]; 
    int characterNumber = 97; 
    cipher[0] = ' '; 
    for(int counter = 1; counter < cipher.length;counter++) 
    { 
     char character = (char) characterNumber; 
     cipher[counter] = character; 
     characterNumber++; 
    } 

    for(int counter = 0; counter < cipher.length;counter++) 
    { 
     int randomLocation = (int) (Math.random()*26); 
     char temporaryCharacter = cipher[randomLocation]; 
     cipher[randomLocation] = cipher[counter]; 
     cipher[counter] = temporaryCharacter; 
    } 
    return cipher; 

} 
+0

. Я провел несколько тестов по этому вопросу, и «а» кажется первой записью 1/20 времени, а не 1/26, как и должно быть («z» - это первая буква, примерно такая же). Возможно, что-то не так с моим тестом, но обычный способ получить случайно упорядоченный список - это не использовать массивы вообще; использовать arraylists и удалять используемые записи, когда вы идете. –

+0

это не работает, если вы хотите перестановки алфавита, поэтому вам нужно очистить то, что именно вы хотите: скручивание алфавита или символов случайно? и скрестив, что именно вы имеете в виду – gpasch

0

Чтобы сделать перестановку алфавита (26 символов, но в другом порядке) вы

boolean[] b=new boolean[26]; 
    for(i=0; i<b.length; i++) b[i]=false; 
for(int counter = 0; counter < 26;counter++) 
{ 
    int randomLocation = (int) (Math.random()*26); 
    while(b[randomLocation]) randomLocation = (int) (Math.random()*26); 
    b[randomLocation]=true; 
    cipher[counter]=alphabet[randomLocation]; 
} 

забыть о «эффективным» и прочее сначала решить проблему

0

Если вы хотите для перетасовки алфавита вы можете использовать Collections.shuffle(..) metode. Somethink так:

public static void main(String[] args) { 
    char[] alphabet = "abcdefghijklmnopqrstuvwxyz".toCharArray(); 
    char[] randomAlphabet = new char[alphabet.length]; 

    // Copy to a List 
    List<Character> list = new ArrayList<Character>(); 
    for (char c : alphabet) { 
     list.add(c); 
    } 

    // shuffle it  
    Collections.shuffle(list); 

    // Copy it back to an array 
    for (int i = 0; i < list.size(); i++) { 
     randomAlphabet[i] = list.get(i); 
    } 

    System.out.print("Random alphabet: "); 
    for (int i = 0; i < randomAlphabet.length; i++) { 
     System.out.print(" " + randomAlphabet[i]); 
    } 
} 

Это дает это, когда я запускаю его:

Random alphabet: j b w q o c r f z k g n p a u s i d m y h v e l x t 
Смежные вопросы