-1 java string random algorithm
我试图生成不重叠的700万个随机字符串(字符串长度必须为2到4)
但是,我的代码花了28023毫秒来生成700万个不重叠的字符串。
我不知道如何有效地生成700万个没有重叠的字符串。
我尝试使用哈希表,列表...,因为我需要键值类型
HashMap<String, Integer> map = new HashMap();
long start = System.currentTimeMillis();
for(int i = 0 ; i < 7000000 ; ) {
int MAX_LENGTH = 4;
int MIN_LENGTH = 2;
StringBuffer temp = new StringBuffer();
Random rnd = new Random();
int length = rnd.nextInt(MAX_LENGTH - MIN_LENGTH + 1) + MIN_LENGTH; // ??? ?? ??(2~4??)
for (int j = 0; j < length; j++) {
int rIndex = rnd.nextInt(2);
switch (rIndex) {
case 0:
// a-z(???)
temp.append((char) ((int) (rnd.nextInt(26)) + 97));
break;
case 1:
// A-Z(???)
temp.append((char) ((int) (rnd.nextInt(26)) + 65));
break;
}
}
String str = temp.toString();
if(!map.containsKey(str)) {
map.put(str, rnd.nextInt());
i++;
}
}
long end = System.currentTimeMillis();
System.out.println("Setup Performance : " + (end - start));
Run Code Online (Sandbox Code Playgroud)
我的代码花了28023毫秒来生成700万个不重叠的字符串。
因此,您要从一组52个字符(A-Z
和a-z
)中生成700万个字符串,每个字符串包含2到4个字符。
一些简单的数学告诉我们,有2,704个可能的2个字符的字符串,140,608个3个字符的字符串和7,311,616个可能的4个字符的字符串。总共有7,454,928个可能的字符串。
因此,创建一个包含从0到7,454,927的所有数字的数组。随机播放,然后从阵列中选择前700万个。
当然,您必须编写代码,将该数字转换为您的输出字符串之一。那很容易。0是“ AA”,51是“ Az”,52是“ BA”。您基本上是在进行整数到字符串的转换。
这是基本思想。您必须转换为Java。
arraySize = 7454928
numbers = new array[arraySize]
// populate array
for i = 0 to arraySize-1
numbers[i] = i
shuffle(numbers)
for i = 0 to 7000000
code = convertNumberToString(numbers[i])
print code
convertNumberToString(n)
Alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
outputString = ""
while (n > 0 || outputString.length < 2)
result = n / 52 // length of alphabet
remainder = n % 52;
outputString.append(Alphabet[remainder])
n = result;
// outputString now contains the characters,
// but they're reversed. So reverse the string.
return outputString.reverse()
Run Code Online (Sandbox Code Playgroud)