java - util - random string generator alphanumeric
ÀÓÀÇÀÇ ¹®ÀÚ¿À» »ç¿ëÇÏ´ÂÀÌ Äڵ尡 "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;
}
}