coolshell 网站有一篇博客探讨了关于洗牌的三种方法,其中一种如题所述,现贴代码如下:
const size_t MAXLEN = 10;
const char TestArr[MAXLEN] = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'};
static char RecurArr[MAXLEN] = {0};
static int cnt = 0;
void ShuffleArray_Recursive_Tmp(char *arr, int len)
{
if (cnt>MAXLEN || len<=0) {
return;
}
int pos = rand()%len;
RecurArr[cnt++] = arr[pos];
if (len==1) return;
ShuffleArray_Recursive_Tmp(arr, pos);
ShuffleArray_Recursive_Tmp(arr+pos+1, len-pos-1);
}
void ShuffleArray_Recursive(char *arr, int len)
{
memset(RecurArr, 0 , sizeof(RecurArr));
cnt = 0;
ShuffleArray_Recursive_Tmp(arr, len);
memcpy(arr, RecurArr, len);
}
void print(char *arr, int len)
{
int i;
for (i=0; i<len; ++i) {
cout << *arr++ <<" ";
}
cout <<endl;
}
void main()
{
char temp[MAXLEN] = {0};
for (int j=0; j<10; ++j) { //统计10次洗牌结果
for (int i=0; i<5; ++i) { //洗一次牌
strncpy(temp, TestArr, MAXLEN);
ShuffleArray_Recursive((char*)temp, MAXLEN);
}
print(temp, MAXLEN);
}
system("pause");
}
还是有点疑问,慢慢看。。