重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
#pragma
成都一家集口碑和实力的网站建设服务商,拥有专业的企业建站团队和靠谱的建站技术,十载企业及个人网站建设经验 ,为成都千余家客户提供网页设计制作,网站开发,企业网站制作建设等服务,包括成都营销型网站建设,高端网站设计,同时也为不同行业的客户提供网站设计、成都网站设计的服务,包括成都电商型网站制作建设,装修行业网站制作建设,传统机械行业网站建设,传统农业行业网站制作建设。在成都做网站,选网站制作建设服务商就选创新互联建站。
once
#include
iostream
#include
Windows.h
using
namespace
std;
#pragma
comment(
lib,
"winmm.lib"
)
int
main()
{
//定义一个数组(自己随便定义,这里以10个大小的数组为例)
const
int
iSum
=
10;
int
iAry[iSum]
=
{3,7,5,87,23,1,65,8,51,64};
//定义一个数组用来保存打乱顺序后的数
int
iDistrubAry[iSum]
=
{0};
//播随机种子(以便每次随机的值有相等的机会)
srand(timeGetTime());
//每次随机的不相同的数存到这个数组里(以便下次随机时判断随机的数是否已经随机过了)
int
iRandomData[iSum]
=
{0};
//将iRandomData元数都赋初值为-1,表示没有产生一个随机数
for
(
int
i=0;
iiSum;
i++
)
{
iRandomData[i]
=
-1;
}
//共产生不同的随机的个数
int
iRandomSum
=
0;
//打乱这个数组
for
(
int
i=0;
iiSum;
i++
)
{
//随机一个数
int
iRandom
=
rand()%iSum;
//判断iRandomSum是否为0,是0的话表示没有随机过任何数,就不用查询是否随机到这个数了
if
(
iRandomSum
!=
)
{
//用来判断是否连续随机(当随机的数与之前随机的有重复时就连续随机)
for
(
int
i=0;
iiRandomSum;
i++
)
{
if
(
iRandom
==
iRandomData[i]
)
{
iRandom
=
rand()%iSum;
//i要赋值为-1,表示重新查询是否与以前随机的数重复
i
=
-1;
}
}
}
//将产生的随机数添加到RandomData里面
iRandomData[iRandomSum]
=
iRandom;
//将随机的数作为原来数组的索引,取出原来数组此索引的值保存在打乱后的数组中
iDistrubAry[iRandomSum]
=
iAry[iRandom];
//将iRandom加1,表明已经打乱好了一个数
iRandomSum++;
}
//显示未打乱的数组
cout"未打乱的数组:";
for
(
int
i=0;
iiSum;
i++
)
{
coutiAry[i]"
";
}
coutendl;
//显示打乱后的数组
cout"打乱后的数组:";
for
(
int
i=0;
iiSum;
i++
)
{
coutiDistrubAry[i]"
";
}
coutendl;
system(
"pause"
);
}
//使用随机数交换的形式打乱数组。随机生成一个随机数组下表,然后进行交换,达到打乱的目的。
#include stdio.h
#include iostream
#includestdlib.h
#includetime.h
using namespace std;
int main()
{
int a[10];
for(int i=0;i10;i++)
{
a[i]=i+1;
}
printf("顺序输出:");
for(int i=0;i10;i++)
{
printf("%d ",a[i]);
}
srand((int)time(NULL));
for(int i=0;i10;i++)
{
swap(a[i],a[rand()%10]);
}
printf("\n打乱顺序后:");
for(int i=0;i10;i++)
{
printf("%d ",a[i]);
}
//system("pause");
}
int a[] = {3,5,7,1,4};
// 本程序考虑时间复杂度最小情况的乱序算法,O(t)=len-1
// 算法模仿彩票摇号,从全集中先取一个为第一位,再在剩余集合中取出一个为第2位,...
// 直至最后一个,只是考虑空间利用,已排序集合利用全集的空间。
int len=sizeof(a); // 全集元素数量
srand(unsigned(time(NULL))); // 摇号机准备
for(int i=len;i1;i--) // 从全集开始摇号,直至只剩一个,已排在最后
{
int cur=len-i+(rand()%i); // 在剩余集合中摇号
int tmp=a[len-i]; // 当前序号位置挪空
a[len-i]=a[cur]; // 摇出的彩球放入当前序号
a[lcur]=tmp; // 放好剩余的彩球
}
1,你先建或者产生从小到大排的的数放一个数组中.原牌x个.
2,产生0到x-1的随机值x个,不要重复.用来做原数组的下标取对应的值,再放入新数组中,
3,输出新组.洗的新牌.
可以这样:
srand(time(0));
for(i=0;iN;i++)
{
m=rand()%9;
n=rand()%9;
t=a[m];
a[m]=a[n];
a[n]=t;
}
就是每次生成两个0到8之间的随机数,然后以它们作为下标,交换两个位置的数字,只要N足够大,应该能够达到要求
因为i=9的时候,执行_rand(i,9);时,在函数_rand里,a为9,b为9,由于i=rand()%b; 所以i最大为8,所以在 if(ia) goto Y; 这个地方会永远跳回到Y。就这么死循环了。