2017년 5월 21일 일요일

card shuffle in java


카드 셔플(섞는것) 시뮬레이션을 코드로 구현해 보았습니다.

트럼프 카드는 (1~10, K,Q,J ) 13*4+2(조커) = 54장입니다.

카드를 섞을때 일반적으로 카드의 아래부분을 끄집어 내어


위로 올린뒤 다시 올린부분의 일정 카드를
  다시 끄집어 내어

위로 올리고 올린 카드 중 일부를 다시 끄집어 내는 과정을 반복합니다.

위 사진은 젝스팀트 카드입니다.

0~8 까지의 카드가 있다고 할때 4,5,6,7,8 이 처음 꺼내는 카드라면

//     F   L
// 012345678
한번 하고 나면 아래와 같은 형태가 되고
//    F   L
// => 456780123
다시 한번 진행하면 6,7,8 선택되면
//      F L
// => 456780123
6,7,8이 앞으로 나가게 되고
//    F L
// => 678450123
8만선택되어 앞으로 나가게 되면 섞기 종료가 됩니다.
//   FL
// => 867450123

이 과정을 shffle() 메소드로 구현하였습니다.


card shuffle 시뮬레이션
package testProject;

public class CardGame1Shuffle {

 public static void main(String[] args) {
  
  char [] card;
  int cardCount = 54;
  card = new char[cardCount];
  for(int i=0;i<cardCount;i++){
   card[i]=(char) ('0'+i);
  }

  for(int j=0;j<54;j++){
   System.out.print("["+j+"]");
   printCard(card);
   shuffle(card);
  }
 }
 
 public static void printCard(char [] card)
 {
  int i;
  for(i=0;i<card.length;i++){
   System.out.print(card[i]);
  }
  System.out.println();  
 }
 
 public static int shuffle(char [] card)
 {
  //     F   L
  // 012345678
  //
  //    F   L
  // => 456780123
  //
  //int shffleCount = 
  int first = getRandomWithEnd(0,card.length-1);
  int last = card.length-1;
  for(;;){
   shuffleOnce(card, first, last);
   last = last-first;
   first = getRandomWithEnd(0,last);
   if(first==last) break;
  }
  return 0;
 }

 public static int shuffleOnce(char [] card, int st1, int st2)
 {
  char [] cardcp = new char[card.length];
  int i,j;
  for(i=0;i<card.length;i++)
  {
   cardcp[i]=card[i];
  }
  for(i=st1,j=0;i<=st2;i++,j++){
   card[j] = cardcp[i];
  }
  for(i=0;i<=st1-1;i++){
   card[j]=cardcp[i];
   j++;
  }
  return 0;
 }
 
 //  getRandomWithSize(0,3) => (0,1,2)
 //  getRandomWithSize(5,3) => (5,6,7)
 public static int getRandomWithSize(int start,int size)
 {
  return (int)(Math.random()*size)+start;
 }
 //  getRandomWithEnd(0,2) => (0,1,2)
 //  getRandomWithEnd(5,7) => (5,6,7)
 public static int getRandomWithEnd(int start,int end)
 {
  return (int)(Math.random()*(end-start+1))+start;
 }
}


결과
[0]0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcde
[1]cdeab\]^_`YZ[TUVWXPQRSJKLMNODEFGHI89:;<=>?@ABC01234567
[2]1234567cdeab\]^_`YZ[TUVWXPQRSJKLMNODEFGHI89:;<=>?@ABC0
[3]C0AB<=>?@1234567cdeab\]^_`YZ[TUVWXPQRSJKLMNODEFGHI89:;
[4];C0AB<=>?@1234567cdeab\]^_`YZ[TUVWXPQRSJKLMNODEFGHI89:
[5]9:8IHGFb\]^_`YZ[TUVWXPQRSJKLMNODE;C0AB<=>?@1234567cdea
[6]a9:8IHGFb\]^_`YZ[TUVWXPQRSJKLMNODE;C0AB<=>?@1234567cde
[7]de@1234567c=>?QRSJKLMNODE;C0AB<[TUVWXP`YZa9:8IHGFb\]^_
[8]]^_\:8IHGFb=>?QRSJKLMNODE;C0AB<[TUVWXP`YZa9de@1234567c
[9]4567c3UVWXP`YZa9de@12=>?QRSJKLMNODE;C0AB<[T]^_\:8IHGFb
[10]Fb8IHG^_\:4567c3UVWXP`YZa9de@12=>?QRSJKLMNODE;C0AB<[T]
[11]a9de@12=>?QRSJKLMNODE;C0AB<[T]Fb8IHG^_\:4567c3UVWXP`YZ
[12]YZ`3UVWXP\:4567c@12=>?QRSJKLMNODE;C0AB<[T]Fb8IHG^_a9de
[13]^_a9deT]Fb8IHG<[YZ`3UVWXP\:4567c@12=>?QRSJKLMNODE;C0AB
[14]ABC0DE;NOKLMSJ^_a9deT]Fb8IHG<[YZ`3UVWXP\:4567c@12=>?QR
[15]?QR>12=ABC0DE;NOKLMSJ^_a9deT]Fb8IHG<[YZ`3UVWXP\:4567c@
[16]c@:4567XP\?QR>12=ABC0DE;NOKLMSJ^_a9deT]Fb8IHG<[YZ`3UVW
[17]HG<[YZ`3UVWXP\?QR>12=ABC0DE;NOKLMSJ^_a9deT]Fb8Ic@:4567
[18]5674deT]Fb8Ic@:^_a9HG<[YZ`3UVWXP\?QR>12=ABC0DE;NOKLMSJ
[19]SJOKLMDE;N9HG<[YZ`3UVWXP\?QR>12=ABC0b8Ic@:^_a5674deT]F
[20]]FTde412=ABC0b8Ic@:^_a567SJOKLMDE;N9HG<[YZ`3UVWXP\?QR>
[21]R>KLMDE;N9HG<[YZ`3UVWXP\?Q67SJOC0b8Ic@:^_a5]FTde412=AB
[22]=AB2de41R>KLMDE;N9HG<[YZ`3UVWXP\?Q67SJOC0b8Ic@:^_a5]FT
[23]FT5]:^_aOC0b8Ic@67SJ=AB2de41R>KLMDE;N9HG<[YZ`3UVWXP\?Q
[24]WXP\?QB2de41R>KLMDE;N9HG<[YZ`3UV7SJ=AFT5]:^_aOC0b8Ic@6
[25]c@6_aOC0b8IWXP\?QB2de41R>KLMDE;N9HG<[YZ`3UV7SJ=AFT5]:^
[26]:^AFT5]9HG<[YZ`3UV7SJ=c@6_aOC0b8IWXP\?QB2de41R>KLMDE;N
[27]MDE;NKL2de41R>QB:^AFT5]9HG<[YZ`3UV7SJ=c@6_aOC0b8IWXP\?
[28]\?XPWc@6_aOC0b8IMDE;NKL2de41R>QB:^AFT5]9HG<[YZ`3UV7SJ=
[29]<[YZ`3UV7SJ=T5]9HGC0b8IMDE;NKL2de41R>QB:^AF\?XPWc@6_aO
[30]aO_c@6We41R>QB:^AF\?XPJ=T5]9HGC0b8IMDE;NKL2d<[YZ`3UV7S
[31]7S;NKL2d<[YZ`3UVIMDE5]9HGC0b8@6We41R>QB:^AF\?XPJ=TaO_c
[32]_cVIMDE5]9HGC0b8@6We41R>QB:^AF\?XPJ=TaOYZ`3U7S;NKL2d<[
[33]<[`3U7S;NKL2d_cVIMDE5]9HGC0b8@6We41R>QB:^AF\?XPJ=TaOYZ
[34]YZOaTAF\?XPJ=1R>QB:^<[`3U7S;NKL2d_cVIMDE5]9HGC0b8@6We4
[35]e4W6GC0b8@PJ=1R>QB:^<[`3U7S;NKL2d_cVIMDE5]9HYZOaTAF\?X
[36]?XAF\YZOaTMDE5]9He4W6GC0b8@PJ=1R>QB:^<[`3U7S;NKL2d_cVI
[37]_cVIdKL2He4W6GC0b8@PJ=1R>QB:^<[`3U7S;N?XAF\YZOaTMDE5]9
[38]5]93U7S;N?XAF\YZOaTMDE_cVIdKL2He4W6GC0b8@PJ=1R>QB:^<[`
[39][`0b8@PJ=1R>QB:^<dKL2He4W6GC3U7S;N?XAF\YZOaTMDE_cVI5]9
[40]]9S;N?XAF\YZOaTMDE_cVI5[`0b8@PJ=1R>QB:^<dKL2He4W6GC3U7
[41]U73CGZOaTMDE_cVI5[`0b8@PJ=1R>QB:^<dKL2He4W6]9S;N?XAF\Y
[42]F\Y]9S;N?XAL2He4W6ZOaTMDE_cVI5[`0b8@PJ=1R>QB:^<dKU73CG
[43][`0b8@PJ=1R>QB:^<dKU73CG\Y]9S;N?XAL2He4W6ZOaTMDE_cVI5F
[44]TMDE_cVI5F6ZOaW4AL2He[`0b8@PJ=1R>QB:^<dKU73CG\Y]9S;N?X
[45]?X;NdKU73CG\Y]9S@PJ=1R>QB:^<TMDE_cVI5F6ZOaW4AL2He[`0b8
[46][`0b8e2H?X;NdKU73CG\Y]9S@PJ=1R>QB:^<TMDE_cVI5F6ZOaW4AL
[47]4ALOaWDE_cVI5F6Z[`0b8e2H?X;NdKU73CG\Y]9S@PJ=1R>QB:^<TM
[48]TM>QB:^<73CG\Y]9S@PJ=1R4ALOaWDE_cVI5F6Z[`0b8e2H?X;NdKU
[49]KUdX;Ne2H?0b8=1R4ALOaWDE_cVI5F6Z[`TM>QB:^<73CG\Y]9S@PJ
[50]3CG\Y]9S@PJQB:^<7I5F6Z[`TM>KUdX;Ne2H?0b8=1R4ALOaWDE_cV
[51]cVE_3CG\Y]9S@PJQB:^<7I5F6Z[`TM>KUdX;Ne2H?0b8=1R4ALOaWD
[52]LOaWDNe2H?0b8=1R4A;JQB:^<7I5F6Z[`TM>KUdX@PcVE_3CG\Y]9S
[53]\Y]9S3CGcVE_F6Z[`TM>KUdX@PLOaWDNe2H?0b8=1R4A;JQB:^<7I5

결과를 보면 효율이 그렇게 좋지 않아서 굉장히 여러번 수행해야 함을 알 수 있습니다







댓글 없음:

댓글 쓰기