반응형

프로그래밍을 하다보면 랜덤 함수를 사용할 일이 많다.

 

숫자건 문자건 예측이 안되는 다량의 문자들을 데이터로써 생성할 수도 있다.

 

거기에 정규식을 이용하면 가상의 단어 조합도 만들 수 있다. 이 모든일이 어디서 부터 시작되는가?

 

난수 발생기로부터 시작된다.

 

자바의 Random 클래스는 java.util 패키지에 있다.

 

Math.random() 으로 짠 소스 코드도 많이 보인다. 스태틱 메소드로 사용할 수 있으니 아무래도 더 자주 쓰게 된다.

 

이 포스팅에서는 위의 두가지를 사용하여 랜덤한 문자열을 생성해 보겠다.

 

 

먼저 숫자를 문자로 바꾸기 위한 아스키 코드에 대하여 알아야 한다.

 

자세한 사항은 아래의 포스팅을 참고하는데, 기본적으로 십진수 숫자 65 ~ 90 까지 영문 소문자, 97 ~ 122까지 영문 대문자이다. 문자형 숫자는 48 ~ 58까지 범위다. 문자형 숫자는 문자형으로 결합이 가능한 숫자를 말한다.

 

좀 헷갈릴 수는 있다. 숫자를 표시하는 것은 아스키 코드이고 char 형이고 내부적으로 저장되는 정수형 숫자는 메모리에 실제 값이 저장되있다.

 

digiconfactory.tistory.com/129

 

C언어 2 - 2 | 자료형 | 아스키코드

C언어에 대한 내용을 다룰 때 아스키 코드에 대한 이야기를 하려고 생각하고 있었다. 다행히 요즘은 인터넷에 아스키 코드에 관해서는 쉬운 설명도 많이 있고 한글 자료도 많다. 아스키코드는

digiconfactory.tistory.com

함수를 만들어서 문자열을 생성하면 편리하다. 위는 소문자를 문자열을 생성하는 코드이다.

 

Math.Random() * (곱하는 수) 의 곱하는 수가 랜덤함수의 범위를 정한다. 0이 포함되어 있으니 1부터 사용하려면 +1을 한다.

 

더 좋은 코드로 만들수도 있겠지만 일단 아스키 코드의 십진수의 범위로 문자를 만들 수 있다. 길이를 for 문에 받아서 문자열에 더하면 문자열이 된다.

 

* 대문자나 숫자를 생성하는 방법도 같다. 아스키 코드의 범위를 적용하면 된다.

 

 

*대문자, 소문자, 숫자 세가지 경우의 수로 분기가 되니까 이것을 무작위로 섞는 것도 가능하다. 아래와 같이 switch case 문을 사용하여 함수를 호출할 수 있다.

 

 

전체 소스 코드는 아래와 같다. Random 클래스는 여러가지 메소드들이 많이 있으니 자세한 내용은 자바 API 문서를 참고한다.

 

docs.oracle.com/javase/8/docs/api/java/util/Random.html

 

Random (Java Platform SE 8 )

An instance of this class is used to generate a stream of pseudorandom numbers. The class uses a 48-bit seed, which is modified using a linear congruential formula. (See Donald Knuth, The Art of Computer Programming, Volume 2, Section 3.2.1.) If two instan

docs.oracle.com

package com;

import java.util.Random;

public class Main {

    public static void main(String[] args) {

        Random random = new Random();
        int length = random.nextInt(5)+5;

        System.out.println(randomWord("lower", length));
        System.out.println(randomWord("upper", length));
        System.out.println(randomWord("number", length));

        StringBuffer newWord = new StringBuffer();
        for (int i = 0; i < length; i++) {
            int mixed = random.nextInt(3);
            switch(mixed) {
                case 0:
                    newWord.append(randomWord("lower", 1));
                    break;
                case 1:
                    newWord.append(randomWord("upper", 1));
                    break;
                case 2:
                    newWord.append(randomWord("number", 1));
                    break;
                default:
                    break;
            }
        }
        System.out.println("newWord = " + newWord);

    }
    static String randomWord(String selectCase, int length){
        if (selectCase == "lower"){
            String lowerRandom ="";
            for (int i = 0; i < length; i++) {
                char lowerCh = (char)((int)(Math.random()*25) + 97);
                lowerRandom += lowerCh;
            }
            return lowerRandom;
        }
        if (selectCase == "upper"){
            String upperRandom ="";
            for (int i = 0; i < length; i++) {
                char upperCh = (char)((int)(Math.random()*25) + 65);
                upperRandom += upperCh;
            }
            return upperRandom;
        }
        if (selectCase == "number"){
            String numRandom ="";
            for (int i = 0; i < length; i++) {
                char ch = (char)((int)(Math.random()*10) + 48);
                numRandom += ch;
            }
            return numRandom;
        }
        return null;
    }
}

대문, 소문, 숫자로 랜덤 문자열이 생성된 것을 볼 수 있다.

 

 

* 좀더 간소화 하면 아래와 같이 작성할 수 있다.

 

        Random random = new Random();
        int length = random.nextInt(5)+5;

        StringBuffer newWord = new StringBuffer();
        for (int i = 0; i < length; i++) {
            int choice = random.nextInt(3);
            switch(choice) {
                case 0:
                    newWord.append((char)((int)random.nextInt(25)+97));
                    break;
                case 1:
                    newWord.append((char)((int)random.nextInt(25)+65));
                    break;
                case 2:
                    newWord.append((char)((int)random.nextInt(10)+48));
                    break;
                default:
                    break;
            }
        }
        System.out.println("newWord = (" + newWord + "), length = " + length);

매번 작성하는게 귀찮으면 모듈처럼 static 함수로 정리해 놓는 것도 나쁘지 않다.

728x90

공유하기

facebook twitter kakaoTalk kakaostory naver band

본문과 관련 있는 내용으로 댓글을 남겨주시면 감사하겠습니다.

비밀글모드