好像是一个比较经典的问题

时间:2022-08-31 20:58:17
有一个数组存放1-100这100个自然数,将其乱序放到另一个大小也是100的数组中。算法是什么?
也就是让你洗牌,算法是怎样的?谢谢。

6 个解决方案

#1


在100个中间随机取一个存到另一个数组中,在剩下的99个在随机取一个。。。一直到最后一个

#2


#3



#include "stdafx.h"
#include <string>
#include <iostream>
#include <time.h>
using namespace std;

struct node
{
char suit;
int num;
};
/* 红桃:hearts, 黑桃:spades, 方块:diamonds, 草花:clubs */
struct node deck[] =
{
{'H',1},{'H',2},{'H',3},{'H',4},{'H',5},{'H',6},{'H',7},
{'H',8},{'H',9},{'H',10},{'H',11},{'H',12},{'H',13},
{'S',1},{'S',2},{'S',3},{'S',4},{'S',5},{'S',6},{'S',7},
{'S',8},{'S',9},{'S',10},{'S',11},{'S',12},{'S',13},
{'D',1},{'D',2},{'D',3},{'D',4},{'D',5},{'D',6},{'D',7},
{'D',8},{'D',9},{'D',10},{'D',11},{'D',12},{'D',13},
{'C',1},{'C',2},{'C',3},{'C',4},{'C',5},{'C',6},{'C',7},
{'C',8},{'C',9},{'C',10},{'C',11},{'C',12},{'C',13}
};

void deckSwap( struct node *p1,struct node *p2 )
{
struct node temp = *p1;
*p1 = *p2;
*p2 = temp;
}

void shuffle( struct node deck[] )
{
srand((unsigned)time(NULL));
int pos1 =0,pos2 = 0,pos11 = 0,pos22 = 0;

for( int i = 0; i < 1000; ++i )
{
while(pos1==pos11&&pos2==pos22)
{
pos1 = rand()%52;
pos2 = rand()%52;
}
pos11 = pos1;
pos22 = pos2;
deckSwap(deck+pos1,deck+pos2);
}
};

int _tmain()
{
cout<<"交换前:"<<endl;
for( int i = 0; i < 52; ++i )
{
if( i%13 == 0 )
cout<<endl<<"第"<<i/12<<"花色:"<<endl;
cout<<deck[i].suit<<deck[i].num<<" ";
}
shuffle(deck);
cout<<endl<<"交换后:"<<endl;
for( int i = 0; i < 52; ++i )
{
if( i%13 == 0 )
cout<<endl<<"第"<<i/12<<"花色:"<<endl;
cout<<deck[i].suit<<deck[i].num<<" ";
}
return 0;
}

#4


这个算法不好,还得标记
给你个比较好的洗牌思路:
1到100顺序放到num[100]中
循环 i = 1 到 100
交换num[i]和num[rnd(100)]
执行循环


这样就洗牌完毕了,不用标记,不用算,只需100次随即交换就行!~

#5


洗牌算法~~~

#6


{
const int ciMax = 10;
int aiArray[ciMax];
int i = 0;
int iRand = 0;

srand(time(0));

for(i = 0; i < ciMax; i++)
aiArray[i] = i + 1;

/* 以i为分界,左边是排好的 */
for(i = 0; i < ciMax - 1; i++)
{ /* 从i到ciMax - 1中随机抽出一个数,并与i位置上的数交换 */
int iRand = rand() % (ciMax - i) + i;
{ /* 交换找到的值和分隔位置上的值 */
int iTemp = 0;
iTemp = aiArray[iRand];
aiArray[iRand] = aiArray[i];
aiArray[i] = iTemp;
}
}

for(i = 0; i < ciMax; i++)
printf("%d ", aiArray[i]);
printf("\n");
}

#1


在100个中间随机取一个存到另一个数组中,在剩下的99个在随机取一个。。。一直到最后一个

#2


#3



#include "stdafx.h"
#include <string>
#include <iostream>
#include <time.h>
using namespace std;

struct node
{
char suit;
int num;
};
/* 红桃:hearts, 黑桃:spades, 方块:diamonds, 草花:clubs */
struct node deck[] =
{
{'H',1},{'H',2},{'H',3},{'H',4},{'H',5},{'H',6},{'H',7},
{'H',8},{'H',9},{'H',10},{'H',11},{'H',12},{'H',13},
{'S',1},{'S',2},{'S',3},{'S',4},{'S',5},{'S',6},{'S',7},
{'S',8},{'S',9},{'S',10},{'S',11},{'S',12},{'S',13},
{'D',1},{'D',2},{'D',3},{'D',4},{'D',5},{'D',6},{'D',7},
{'D',8},{'D',9},{'D',10},{'D',11},{'D',12},{'D',13},
{'C',1},{'C',2},{'C',3},{'C',4},{'C',5},{'C',6},{'C',7},
{'C',8},{'C',9},{'C',10},{'C',11},{'C',12},{'C',13}
};

void deckSwap( struct node *p1,struct node *p2 )
{
struct node temp = *p1;
*p1 = *p2;
*p2 = temp;
}

void shuffle( struct node deck[] )
{
srand((unsigned)time(NULL));
int pos1 =0,pos2 = 0,pos11 = 0,pos22 = 0;

for( int i = 0; i < 1000; ++i )
{
while(pos1==pos11&&pos2==pos22)
{
pos1 = rand()%52;
pos2 = rand()%52;
}
pos11 = pos1;
pos22 = pos2;
deckSwap(deck+pos1,deck+pos2);
}
};

int _tmain()
{
cout<<"交换前:"<<endl;
for( int i = 0; i < 52; ++i )
{
if( i%13 == 0 )
cout<<endl<<"第"<<i/12<<"花色:"<<endl;
cout<<deck[i].suit<<deck[i].num<<" ";
}
shuffle(deck);
cout<<endl<<"交换后:"<<endl;
for( int i = 0; i < 52; ++i )
{
if( i%13 == 0 )
cout<<endl<<"第"<<i/12<<"花色:"<<endl;
cout<<deck[i].suit<<deck[i].num<<" ";
}
return 0;
}

#4


这个算法不好,还得标记
给你个比较好的洗牌思路:
1到100顺序放到num[100]中
循环 i = 1 到 100
交换num[i]和num[rnd(100)]
执行循环


这样就洗牌完毕了,不用标记,不用算,只需100次随即交换就行!~

#5


洗牌算法~~~

#6


{
const int ciMax = 10;
int aiArray[ciMax];
int i = 0;
int iRand = 0;

srand(time(0));

for(i = 0; i < ciMax; i++)
aiArray[i] = i + 1;

/* 以i为分界,左边是排好的 */
for(i = 0; i < ciMax - 1; i++)
{ /* 从i到ciMax - 1中随机抽出一个数,并与i位置上的数交换 */
int iRand = rand() % (ciMax - i) + i;
{ /* 交换找到的值和分隔位置上的值 */
int iTemp = 0;
iTemp = aiArray[iRand];
aiArray[iRand] = aiArray[i];
aiArray[i] = iTemp;
}
}

for(i = 0; i < ciMax; i++)
printf("%d ", aiArray[i]);
printf("\n");
}