# Random generation of nine palace pattern cipher - Implementation

Keywords: Java

I didn't mean to see a string of code that I wrote again after I practiced my basic skills at home after I failed an interview.

There are tens of thousands of methods. The following are the most impressive ones for me. Looking back, I still think it's meaningful to learn, so I send them out to share learning.

The original condition of the problem is not remember too Qing, and the general realization is: randomly generate the nine palace pattern (gesture) password

There are several points to read:
1. Password length can be set

2. The path of gesture password must be direct

It can be realized in two ways:

1. Can arr judge whether the value before and after can reach directly

2. getNum gets the next value based on the previous value

``````package com.maomao;

import org.testng.annotations.Test;
import java.util.HashMap;
import java.util.Map;

//Random generated nine grid graphic password, random number range 1～9
public class RandomScret {

//9 In the grid, 1~9 Direct numerical value, discovery rule
//Except for 5
//Odd number, 1, 3, 7, 9, four corners can't be reached directly
//Even numbers, 2, 4, 6, 8, diagonals are not directly accessible, and the difference between diagonals and 5 is the same
//    int[] num_1={2,4,5,6,8};
//    int[] num_2={1,3,4,5,6,7,9};
//    int[] num_3={2,4,5,6,8};
//    int[] num_4={1,2,3,5,7,8,9};
//    int[] num_5={1,2,3,4,6,7,8,9};
//    int[] num_6={1,2,3,5,7,8,9};
//    int[] num_7={2,4,5,6,8};
//    int[] num_8={1,3,4,5,6,7,9};
//    int[] num_9={2,4,5,6,8};

//Get 1～9 Random integer of
//( n~m Random number formula:(int)(Math.random()*(m-n+1) +n)))
public static int getRandomNum(){
int num=(int)(Math.random()*9+1);
return num;
}

//Judge whether it can arrive -----It's a way of trial and error,Takes a long time
public Boolean canArr(int preNum,int randomNum){
//Mark, not reachable by default
boolean flag = false;
//Before and after values cannot be equal
if (preNum!=randomNum){
if (preNum==5 ) {
flag = true;
}else if (randomNum==5){
flag = true;
}else if (preNum%2==0){ //It's even
int n=Math.abs(preNum-5);
int m=Math.abs(randomNum-5);
if (n!=m){
flag=true;
}
}else if (preNum%2==1){ //preNum It's an odd number except five
if (randomNum%2==0){
flag=true;
}
}
}

return flag;
}

//Construct a direct path ------This method takes up memory and takes a short time
public Map<Integer,int[]> All() {
Map<Integer, int[]> map = new HashMap<>();
map.put(1,new int[]{2,4,5,6,8});
map.put(2,new int[]{1,3,4,5,6,7,9});
map.put(3,new int[]{2,4,5,6,8});
map.put(4,new int[]{1,2,3,5,7,8,9});
map.put(5,new int[]{1,2,3,4,6,7,8,9});
map.put(6,new int[]{1,2,3,5,7,8,9});
map.put(7,new int[]{2,4,5,6,8});
map.put(8,new int[]{1,3,4,5,6,7,9});
map.put(9,new int[]{2,4,5,6,8});

return map;
}
public int getNum(int preNum){
//        int tag=(int)(Math.random()*10);
int[] nextArr=All().get(preNum);
int tag=(int)(Math.random()*10+1);//1~10
int next=nextArr[tag%nextArr.length];
return next;
}

@Test
public void test1(){
RandomScret rs=new RandomScret();

int length=6;
int[] scret=new int[length];

//Specify build
int preNum=getRandomNum();
for (int i=0;i<length;i++){
scret[i]=rs.getNum(preNum);
preNum=scret[i];
}

for (int num:scret){
System.out.println(num);
}
}

@Test
public void test2(){
RandomScret rs=new RandomScret();

int length=6;
int[] scret=new int[length];

//Random generation
int preNum=getRandomNum();
for (int i=0;i<length;){
int randomNum=getRandomNum();
if (rs.canArr(preNum,randomNum)){
scret[i]=randomNum;
preNum=scret[i];
i++;
}else {
continue;
}
}

for (int num:scret){
System.out.println(num);
}
}
}``````

Posted by Shaun13 on Wed, 13 May 2020 08:19:22 -0700