CORE
HOME > JAVA > J2SE > CORE
2020.10.03 / 18:13

java - util - random string generator alphanumeric

Ãß¼®µ¹ÀÌ
Ãßõ ¼ö 202

ÀÓÀÇÀÇ ¹®ÀÚ¿­À» »ç¿ëÇÏ´ÂÀÌ Äڵ尡 "hello world"¸¦ ÀμâÇÏ´Â ÀÌÀ¯´Â ¹«¾ùÀԴϱî? (10)

Denis Tulskiy answer ´ëÇÑ »ç¼ÒÇÑ °³¼±ÀÌ ÀÖ½À´Ï´Ù. ½Ã°£À» ¹ÝÀ¸·Î ÁÙÀδÙ.

public static long[] generateSeed(String goal, long start, long finish) {
    char[] input = goal.toCharArray();

    int[] dif = new int[input.length - 1];
    for (int i = 1; i < input.length; i++) {
        dif[i - 1] = input[i] - input[i - 1];
    }

    mainLoop:
    for (long seed = start; seed < finish; seed++) {
        Random random = new Random(seed);
        int lastChar = random.nextInt(27);
        int base = input[0] - lastChar;
        for (int d : dif) {
            int nextChar = random.nextInt(27);
            if (nextChar - lastChar != d) {
                continue mainLoop;
            }
            lastChar = nextChar;
        }
        if(random.nextInt(27) == 0){
            return new long[]{seed, base};
        }
    }

    throw new NoSuchElementException("Sorry :/");
}

´ÙÀ½ print ¹®Àº "hello world"¸¦ ÀμâÇÕ´Ï´Ù. ¾Æ¹«µµ ÀÌ°ÍÀ» ¼³¸í ÇÒ ¼ö ÀÖÀ»±î¿ä?

System.out.println(randomString(-229985452) + " " + randomString(-147909649));

±×¸®°í randomString() Àº ´ÙÀ½°ú °°½À´Ï´Ù.

public static String randomString(int i)
{
    Random ran = new Random(i);
    StringBuilder sb = new StringBuilder();
    while (true)
    {
        int k = ran.nextInt(27);
        if (k == 0)
            break;

        sb.append((char)('`' + k));
    }

    return sb.toString();
}

Java ¹®¼­¿¡¼­ ÀÌ°ÍÀº Random Ŭ·¡½ºÀÇ ½Ãµå °ªÀ» ÁöÁ¤ÇÒ ¶§ ÀǵµÀû ÀÎ ±â´ÉÀÔ´Ï´Ù.

¹«ÀÛÀ§ÀÇ µÎ ÀνºÅϽº°¡ µ¿ÀÏÇÑ ½Ãµå·Î ¸¸µé¾îÁö°í µ¿ÀÏÇÑ ¸Þ¼­µå È£Ãâ ½ÃÄö½º°¡ ​​°¢°¢ ¸¸µé¾îÁö¸é µ¿ÀÏÇÑ ¼ýÀÚ ½ÃÄö½º°¡ ​​»ý¼ºµÇ¾î ¹ÝȯµË´Ï´Ù. ÀÌ ÇÁ·ÎÆÛƼ¸¦ º¸ÁõÇϱâ À§Çؼ­, ƯÁ¤ÀÇ ¾Ë°í¸®ÁòÀÌ Å¬·¡½º Random¿¡ ´ëÇØ ÁöÁ¤µË´Ï´Ù. ÀÚ¹Ù ±¸ÇöÀº Java ÄÚµåÀÇ Àý´ë À̽ļºÀ» À§ÇØ Random Ŭ·¡½º¿¡ ´ëÇØ ¿©±â¿¡ Ç¥½ÃµÈ ¸ðµç ¾Ë°í¸®ÁòÀ» »ç¿ëÇؾßÇÕ´Ï´Ù.

http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Random.html

ÀÌ»óÇÏÁö¸¸ ¿¹»ó ÇÒ ¼öÀÖ´Â 'ÀÓÀÇÀÇ'¼ýÀÚ°¡ÀÖ´Â °æ¿ì ¾Ï½ÃÀûÀÎ º¸¾È ¹®Á¦°¡ ÀÖ´Ù°í »ý°¢ÇÒ ¼ö ÀÖ½À´Ï´Ù.


RandomÀº Ç×»ó °°Àº ¼ø¼­¸¦ ¸®ÅÏÇÕ´Ï´Ù. ¹è¿­°ú ´Ù¸¥ ¿¬»êÀ» ¼ø¿­·Î »ç¿ëÇÕ´Ï´Ù.

´Ù¸¥ ½ÃÄö½º¸¦ ¾òÀ¸·Á¸é "seed"¶ó°íÇÏ´Â ¾î¶² À§Ä¡¿¡¼­ ½ÃÄö½º¸¦ ÃʱâÈ­ÇؾßÇÕ´Ï´Ù.

randomStingÀº "ÀÓÀÇ"½ÃÄö½ºÀÇ i À§Ä¡ (½Ãµå = -229985452)¿¡ ÀÓÀÇÀÇ ¼ýÀÚ¸¦ °¡Á®¿É´Ï´Ù. ±×·± ´ÙÀ½ÀÌ °ªÀÌ 0ÀÌ µÉ ¶§±îÁö ½Ãµå À§Ä¡ µÚÀÇ ½ÃÄö½º¿¡¼­ ´ÙÀ½ 27 ¹®ÀÚÀÇ ASCII Äڵ带 »ç¿ëÇÕ´Ï´Ù. ÀÌ·¸°ÔÇϸé "hello"°¡ ¹ÝȯµË´Ï´Ù. °°Àº ÀÛ¾÷ÀÌ "¼¼°è"¿¡ ´ëÇØ ¼öÇàµË´Ï´Ù.

³ª´Â ±× Äڵ尡 ´Ù¸¥ ¾î¶² ´Ü¾îµé¿¡¼­µµ ÀÛµ¿ÇÏÁö ¾Ê´Â´Ù°í »ý°¢ÇÑ´Ù. ¹«ÀÛÀ§ ¼ø¼­¸¦ Àß ¾Ë°íÀÖ´Â ÇÁ·Î±×·¡¹Ö µÈ »ç¶÷.

±×°ÍÀº ¾ÆÁÖ ÈǸ¢ÇÑ ±«Â¥ ÄÚµåÀÔ´Ï´Ù!


±×°ÍÀº "¾¾¾Ñ"¿¡ °üÇÑ °ÍÀÔ´Ï´Ù. °°Àº ¾¾¾Ñµµ °°Àº °á°ú¸¦³À´Ï´Ù.


³ª´Â ÀÌ°Í¿¡ Èï¹Ì¸¦ ´À²¼´Ù. ³ª´ÂÀÌ ÀÓÀÇÀÇ ´Ü¾î »ý¼º±â¸¦ »çÀü ´Ü¾î ¸ñ·Ï¿¡ ¿Ã·Á ³õ¾Ò´Ù. ¹üÀ§ : Integer.MIN_VALUE - Integer.MAX_VALUE

³ª´Â 15131ÀÇ È÷Æ®¸¦ ¾ò¾ú´Ù.

int[] arrInt = {-2146926310, -1885533740, -274140519, 
                -2145247212, -1845077092, -2143584283,
                -2147483454, -2138225126, -2147375969};

for(int seed : arrInt){
    System.out.print(randomString(seed) + " ");
}

Àμ⹰

the quick browny fox jumps over a lazy dog 

³ª´ÂÀÌ ¾¾¾ÑÀ» ã´Â ºü¸¥ ÇÁ·Î±×·¥À» ½è´Ù.

import java.lang.*;
import java.util.*;
import java.io.*;

public class RandomWords {
    public static void main (String[] args) {
        Set<String> wordSet = new HashSet<String>();
        String fileName = (args.length > 0 ? args[0] : "/usr/share/dict/words");
        readWordMap(wordSet, fileName);
        System.err.println(wordSet.size() + " words read.");
        findRandomWords(wordSet);
    }

    private static void readWordMap (Set<String> wordSet, String fileName) {
        try {
            BufferedReader reader = new BufferedReader(new FileReader(fileName));
            String line;
            while ((line = reader.readLine()) != null) {
                line = line.trim().toLowerCase();
                if (isLowerAlpha(line)) wordSet.add(line);
            }
        }
        catch (IOException e) {
            System.err.println("Error reading from " + fileName + ": " + e);
        }
    }

    private static boolean isLowerAlpha (String word) {
        char[] c = word.toCharArray();
        for (int i = 0; i < c.length; i++) {
            if (c[i] < 'a' || c[i] > 'z') return false;
        }
        return true;
    }

    private static void findRandomWords (Set<String> wordSet) {
        char[] c = new char[256];
        Random r = new Random();
        for (long seed0 = 0; seed0 >= 0; seed0++) {
            for (int sign = -1; sign <= 1; sign += 2) {
                long seed = seed0 * sign;
                r.setSeed(seed);
                int i;
                for (i = 0; i < c.length; i++) {
                    int n = r.nextInt(27);
                    if (n == 0) break;
                    c[i] = (char)((int)'a' + n - 1);
                }
                String s = new String(c, 0, i);
                if (wordSet.contains(s)) {
                    System.out.println(s + ": " + seed);
                    wordSet.remove(s);
                }
            }
        }
    }
}

³ª´Â ±×°ÍÀ» ¹è°æÀ¸·Î »ç¿ëÇÏ°í ÀÖÁö¸¸, ÀÌ¹Ì °íÀüÀûÀÎ Æαۿ¡´Â ÃæºÐÇÑ ´Ü¾î°¡ÀÖ´Ù.

import java.lang.*;
import java.util.*;

public class RandomWordsTest {
    public static void main (String[] args) {
        long[] a = {-73, -157512326, -112386651, 71425, -104434815,
                    -128911, -88019, -7691161, 1115727};
        for (int i = 0; i < a.length; i++) {
            Random r = new Random(a[i]);
            StringBuilder sb = new StringBuilder();
            int n;
            while ((n = r.nextInt(27)) > 0) sb.append((char)('`' + n));
            System.out.println(sb);
        }
    }
}

À̵¥¿Â µ¥¸ð. )

Ãß½Å. -727295876, -128911, -1611659, -235516779 .


´ëºÎºÐÀÇ ³­¼ö »ý¼º±â´Â »ç½Ç "ÀÇ»ç ·£´ý (pseudo random)"ÀÔ´Ï´Ù. ±×µéÀº Linear Congruential Generators ¶Ç´Â LCGÀÔ´Ï´Ù ( http://en.wikipedia.org/wiki/Linear_congruential_generator ).

°íÁ¤ µÈ Á¾ÀÚ°¡ ÁÖ¾îÁø´Ù¸é LCG´Â ²Ï ¿¹Ãø °¡´ÉÇÕ´Ï´Ù. ±âº»ÀûÀ¸·Î ù ¹ø° ¹®ÀÚ¸¦ Á¦°øÇÏ´Â ½Ãµå¸¦ »ç¿ëÇÏ°í ´ë»ó ¹®ÀÚ¿­ÀÇ ´ÙÀ½ ¹®ÀÚ¸¦ Ä¡°í LCG¸¦ È£Ãâ ÇÑ È½¼ö¸¦ ±â·Ï ÇÒ ¶§±îÁö ´ÙÀ½ int (char)¸¦ °è¼Ó »ý¼ºÇÏ´Â ¾ÛÀ» ÀÛ¼ºÇÕ´Ï´Ù. °¢ ¹®ÀÚ¸¦ »ý¼º ÇÒ ¶§±îÁö °è¼ÓÇϽʽÿÀ.


¿©±âÀÖ´Â ¸ðµç »ç¶÷µéÀº Äڵ尡 ÀÛµ¿ÇÏ´Â ¹æ½ÄÀ» ¼³¸íÇÏ°í ÀڽŠ¸¸ÀÇ ¿¹Á¦¸¦ ±¸¼ºÇÏ´Â ¹æ¹ýÀ» º¸¿© ÁÖ¾úÁö¸¸ ¹«Â÷º° ´ëÇ× °Ë»öÀÌ °á±¹¿¡´Â ãÀ» ¼öÀÖ´Â ¼Ö·ç¼ÇÀÌ ÇÕ¸®ÀûÀ¸·Î ±â´ëÇÒ ¼öÀÖ´Â ÀÌÀ¯¸¦ º¸¿©ÁÖ´Â Á¤º¸ ÀÌ·ÐÀû ´äº¯À» Á¦°øÇÕ´Ï´Ù.

26 °³ÀÇ ¼Ò¹®ÀÚ´Â ¾ËÆĺª ¥Ò ÇÕ´Ï´Ù. ´Ù¸¥ ±æÀÌÀÇ ´Ü¾î¸¦ »ý¼º ÇÒ ¼ö ÀÖµµ·Ï Á¾°á ±âÈ£ ¡Ñ ¸¦ Ãß°¡ÇÏ¿© È®Àå ¾ËÆĺª ¥Ò' := ¥Ò ¡ú {¡Ñ} ÇÕ´Ï´Ù.

¥á ±âÈ£·Î, X¸¦ ¥Ò' ´ëÇØ ±ÕÀÏÇÏ°Ô ºÐÆ÷ µÈ È®·ü º¯¼ö ¶óÇÏÀÚ. ±× ½Éº¼ P(X = ¥á) ¿Í ±×°ÍÀÇ Á¤º¸ ³»¿ë I(¥á) ¸¦ ¾òÀ» È®·üÀº ´ÙÀ½°ú °°ÀÌ ÁÖ¾îÁø´Ù :

P (X = ¥á) = 1 / | ¥Ò '| = 1 / 27

I (¥á) = -log2 [P (X = ¥á)] = -log2 (1/27) = log2 (27)

¥ø ¡ô ¥Ò* ¶ó´Â ´Ü¾î¿Í ¡Ñ- Á¾°á µÈ »ó´ë ¥ø' := ¥ø ¡¤ ¡Ñ ¡ô (¥Ò')* ¿¡ ´ëÇØ ¿ì¸®´Â

I (¥ø) : = I (¥ø ') = | ¥ø'| * log2 (27) = (| ¥ø | + 1) * log2 (27)

ÀÇ»ç ·£´ý ³Ñ¹ö »ý¼º±â (PRNG)´Â 32 ºñÆ® ½Ãµå·Î ÃʱâÈ­µÇ¹Ç·Î, ÃÖ´ë ±æÀÌÀÇ ´Ü¾î°¡

¥ë = Ç÷ξî [32 / log2 (27)] - 1 = 5

Àû¾îµµ ÇϳªÀÇ ½Ãµå¿¡ ÀÇÇØ »ý¼ºµË´Ï´Ù. 6 ÀÚ ´Ü¾î¸¦ °Ë»öÇÏ´õ¶óµµ 41.06 %ÀÇ ¼º°ø·üÀ» º¸ÀÔ´Ï´Ù. ³Ê¹« ÃʶóÇÑ.

7 ±ÛÀÚ´Â 1.52 %¿¡ °¡±õ½À´Ï´Ù. ±×·¯³ª ±×°ÍÀ» ½ÃµµÇϱâ Àü¿¡ ±ú´ÝÁö ¸øÇß½À´Ï´Ù.

#include <iostream>
#include <random>

int main()
{
    std::mt19937 rng(631647094);
    std::uniform_int_distribution<char> dist('a', 'z' + 1);

    char alpha;
    while ((alpha = dist(rng)) != 'z' + 1)
    {
        std::cout << alpha;
    }
}

Ãâ·ÂÀ»º¸½Ê½Ã¿À : http://ideone.com/JRGb3l


java.util.Random ÀÇ ÀνºÅϽº°¡ ƯÁ¤ ½Ãµå ¸Å°³ º¯¼ö (ÀÌ °æ¿ì -229985452 ¶Ç´Â -147909649 )·Î »ý¼ºµÇ¸é ÇØ´ç ½Ãµå °ªÀ¸·Î ½ÃÀÛ ÇÏ´Â ³­¼ö »ý¼º ¾Ë°í¸®ÁòÀ» µû¸¨´Ï´Ù.

µ¿ÀÏÇÑ ½Ãµå·Î »ý¼º µÈ ¸ðµç Random Àº ¸Å ¹ø µ¿ÀÏÇÑ ÆÐÅÏÀÇ ÆÐÅÏÀ» »ý¼ºÇÕ´Ï´Ù.


Denis Tulskiy ÀÇ ´äº¯¿¡¼­ ÆÄ»ý µÈÀÌ ¸Þ¼­µå´Â ½Ãµå¸¦ »ý¼ºÇÕ´Ï´Ù.

public static long generateSeed(String goal, long start, long finish) {
    char[] input = goal.toCharArray();
    char[] pool = new char[input.length];
    label:
        for (long seed = start; seed < finish; seed++) {
            Random random = new Random(seed);

            for (int i = 0; i < input.length; i++)
                pool[i] = (char) (random.nextInt(27)+'`');

            if (random.nextInt(27) == 0) {
                for (int i = 0; i < input.length; i++) {
                    if (input[i] != pool[i])
                        continue label;
                }
                return seed;
            }

        }