자바프로그래밍 개인공부 - 배열 랜덤 인덱스


10의 길이의 배열을 만들고 거기에 1에서 10까지의 숫자를 차례로 1,2,3,4,......10 까지 넣는다. 그것을 여러번 섞어서 4.3.2.6.5.10... 처럼

랜덤의 배열로 만들어주는 것이다. 


* import java.util.Arrays; 를 import 해줘야함. 

* 배열을 프린트할때 쓰는것 : System.out.println( Arrays.toString(배열이름만));  


내코드 : 

int [] shuffle = new int [10]; 

for ( int i = 0 ; i < shuffle.length ; i++ ){ 

shuffle[i] = i+1 ;

}

System.out.println(Arrays.toString(shuffle)) ; 

 for ( int k = 0 ; k < shuffle.length ; k++){

int i = (int)(Math.random()*10); 

int first = shuffle[0];

shuffle[k] = shuffle[i]; 

shuffle[i] = first ;

}

System.out.println(Arrays.toString(shuffle)); 


틀린이유 : 랜덤으로 뽑은 i  랜덤하게 뽑혀나오는 수는 10까지의 숫자가

겹치지 않고 랜덤으로 나오는게 아니라 , 67666 이렇게 나올수도 있다. 

그래서 shuffle[k] 이렇게 해서 k 가 0부터 9까지 나오고 모든 배열에 저장을

하게 되는데 랜덤한 수가 shuffle[6] , shuffle[6] 이렇게 계속 같은수가 

배열여러곳에 들어갈 수 있는 것이다. 



해결책 : 그래서 서로 맞교환해주는 애가 하나는 고정되어 있는 배열의 몇번째 수이고 다른 하나는 계속 랜덤으로 뽑아주는 애가 나오게 해서 

고정되어있는예를들어 shuffle[0]애에 있는 수와 계속 랜덤으로 나오는 수인 

shuffle[i] 를 계속 변경해주면 shuffle[0] 도 계속변경되며 shuffle[ 0 에서 10까지의 수] 도 모두 변경이 계속해서 된다. 

그런데 그때 주의할 점은 고정되어 있는 수 예를들어 shuffle[0]을 고정시키는 수로 정했을때 그 수는 다른 변수에 저장을 해서 없어지지 않도록 해줘야 한다. 

shuffle[0] 즉 고정시킨 애는 배열의 랜덤번째 수로 변경이 되고 사라지기 때문에 

shuffle[0]과 랜덤으로 변경된 수에 항상 shuffle[0] 이었던 애를 저장해주면 

된다. 



그럼 코드로 작성을 해보자. 


for(int i = 0 ; i <shuffle.length ; i++){ 

int k = (int)(Math.random() * 10 );

int first = shuffle[0]; 

shuffle[0] = shuffle [k];

shuffle[k] = first; 

}

System.out.println(Arrays.toString(shuffle)); 



//1부터 10 까지의 랜덤값 500번 생성, 각 숫자가 생성된 횟수를 출력하기 

int [] num = new int[500]; 

for ( int i = 0 ; i < 500 ; i++  ){

int k = (int)(Math.random() * 10 ) + 1;  

num[i] = k ; 

}

System.out.println(Arrays.toString(num)); 

//num 은 500길이의 즉 0부터 499까지의 자리가 있는 배열이다. 

//1부터 10 까지의 숫자가 500개가 들어있고 각각 500개중에서 1이 몇개고 2가 몇개고를 구해야함. 

int [] count = new int [10]; 

for ( int i = 0 ; i < num.length ; i++ ){ 

for ( int k = 1 ; k < 11 ; k++ ) {  

if (num[i] == k ){

count[k-1] ++ ; 

}

}

}

System.out.println(Arrays.toString(count)); 


--------------------------선생님 코드는 500가지의 수를 배열로 만들지 않고

그냥 숫자를 뽑는것만 썼음. 그리고 그 숫자를 바로 카운트배열에 카운트해버림. 

int [] count_ = new int [10];


for (int i = 0; i < 500 ; i++ ) {

     int ran = (int)(Math.random()*10 ) + 1; 

    count_[ran -1 ]++; 

}

System.out.println(Arrays.toString(count_));





댓글