之前看了一篇文章,忘记了里面有段代码:
public static void main(String[] arg){
System.out.println(randomString(-229985452) + " " + randomString(-147909649));
}
private 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();
}
输出结果是: hello world
原理是java中的random是伪random,所以只要 key固定,随机出的序列是固定的。
我不想深究其中原理,我想的是把一些字符串弄出来是不是很好玩。 于是有了下面的程序,为了方便,我把数据灌入方式写在数组中。
public class RandomTest {
private static int useSeconds = 0;
private static final int maxTime = 400;
private static boolean isRun = true;
public static void main(String[] arg){
System.out.println(randomString(-229985452) + " " + randomString(-147909649));
int[] hello_world = {-229985452, -147909649};
int[] i_love_you = {-2147482998,-2125808017,-2147058567};
System.out.println(getString(hello_world));
System.out.println(getString(i_love_you));
// find random key
String targetStr = "I Love You";
findMyRandomkey(targetStr);
}
private static String getString(int[] keys){
StringBuilder stringBuilder = new StringBuilder();
for (int key : keys) {
stringBuilder.append(randomString(key)).append(" ");
}
return stringBuilder.toString();
}
private 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();
}
private static void findMyRandomkey(String targetStr){
startTimer();
String[] targetStrs = targetStr.toLowerCase().split(" ");
StringBuilder stringBuilder = new StringBuilder("{");
int result ;
for(String str : targetStrs){
byte[] e = str.getBytes();
for(byte i=0 ;i<e.length; i++){
e[i] -= '`';
}
if(Integer.MAX_VALUE != (result =findRandomkey(e))){
stringBuilder.append(result).append(",");
}
}
stringBuilder.delete(stringBuilder.length()-1, stringBuilder.length());
stringBuilder.append("}");
System.out.println("result keys is : " + stringBuilder.toString());
stopTimer();
}
private static int findRandomkey(byte[] ints){
int maxValue = 0;
for (int value: ints) {
if (maxValue < value)
maxValue = value;
}
Random random;
boolean isFind;
for(int i = Integer.MIN_VALUE; i<Integer.MAX_VALUE; i++){
if (isTimeOut()){
return Integer.MAX_VALUE;
}
if(i== Integer.MAX_VALUE-2)
System.out.println(i);
random = new Random(i);
isFind = true;
for (byte anInt : ints) {
if (random.nextInt(27) != anInt) {
isFind = false;
break;
}
}
if(isFind && random.nextInt(27) == 0){
return i;
}
}
return Integer.MAX_VALUE;
}
private static void startTimer(){
useSeconds = 0;
new Thread(new Runnable() {
public void run() {
while (isRun && !isTimeOut()){
System.out.println(" " + useSeconds);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
useSeconds++;
}
}
}).start();
}
private static void stopTimer(){
isRun = false;
System.out.println("共用时 " + useSeconds + " 秒");
}
private static boolean isTimeOut(){
return useSeconds >= maxTime;
}
}