洗牌C语言问题

Python06

洗牌C语言问题,第1张

1 2 3 4 5 6 7 8(假定有8张牌),牌分别是1-8,现在的次序也是1-8

5 1 6 2 7 3 8 4(第一次洗牌,把1-4的牌放入第2、4、6、8的位置,把5-8的牌放到1、3、5、7的位置)

7 5 3 1 8 6 4 2(同上,第二次洗牌,5162放到2、4、6、8 , 7384放到1、3、5、7)

整个过程如下

1    2    3    4    5    6    7    8 (原始)   

5    1    6    2    7    3    8    4    

7    5    3    1    8    6    4    2    

8    7    6    5    4    3    2    1    

4    8    3    7    2    6    1    5    

2    4    6    8    1    3    5    7    

1    2    3    4    5    6    7    8

#include<stdio.h>

#include<stdlib.h>

#include<time.h>

int n,a[20],b[20],c[20],n2

void init()

{int i,j,k,t

 for(i=0i<n2i++)

   a[i]=i+1

 srand(time(0))

 for(i=0,j=n2i<jj--)

 {k=rand()%j

  t=a[j-1]a[j-1]=a[k]a[k]=t

 } 

 for(i=0i<n2i++)

   c[i]=a[i]

}

void prt()

{for(int i=0i<n2i++)

 {printf("%3d",a[i])

  if(i==n-1)printf("  ||")

 }

 printf("\n")

}

void work()

{int i,t

 for(i=1i<n2-1i++)

   {t=i<n?i+i:(i+i)%n2+1

    b[t]=a[i]

 //   printf("b[%d]=a[%d]\n",(i+i)%n2+1,i)

}

 for(i=1i<n2-1i++)

   a[i]=b[i]

}

bool done()

{for(int i=1i<n2i++)

   if(a[i]!=c[i])return false

 return true  

}

int main()

{scanf("%d",&n)

 n2=n+n

 init()

 prt()

 do

 {work()

  prt()

 }while(!done())

 return 0

}

洗牌就随机排序的问题,所以就需要使用库函数rand(),或者自己编写一个伪随机数来实现。

C++里STL里有一个函数random_shuffle()就能实现这样的功能。

#include <stdlib.h>

#include <time.h>

#include <stdio.h>

// 洗牌函数

void random_shuffle(int * array, int len)

{

int * p = array, temp, pos

for (int i = 1 i < len ++i)

{

pos  = rand() % i

temp = *p

*p++ = array[pos]

array[pos] = temp

}

}

// 显示函数

void print(int * array)

{

int i

const char sign1[][4] = {"红", "黑", "方", "草"}

const char sign2[][4] = {"A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"}

for(i=0 i<52 ++i)

{

printf("%s%2s  ", sign1[array[i] / 13], sign2[array[i] % 13])

if(i % 13 == 12) printf("\n")

}

printf("\n")

}

int main()

{

srand(time(NULL)) // 初始化随机数

int card[52], i

for(i=0 i<52 ++i) card[i] = i // 初始化牌

print(card)

random_shuffle(card, 52) // 洗牌

print(card)

return 0

}