⑴ 用c语言怎样打乱一组数据
#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;
i<iSum;
i++
)
{
iRandomData[i]
=
-1;
}
//共产生不同的随机的个数
int
iRandomSum
=
0;
//打乱这个数组
for
(
int
i=0;
i<iSum;
i++
)
{
//随机一个数
int
iRandom
=
rand()%iSum;
//判断iRandomSum是否为0,是0的话表示没有随机过任何数,就不用查询是否随机到这个数了
if
(
iRandomSum
!=
0
)
{
//用来判断是否连续随机(当随机的数与之前随机的有重复时就连续随机)
for
(
int
i=0;
i<iRandomSum;
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;
i<iSum;
i++
)
{
cout<<iAry[i]<<"
";
}
cout<<endl;
//显示打乱后的数组
cout<<"打乱后的数组:";
for
(
int
i=0;
i<iSum;
i++
)
{
cout<<iDistrubAry[i]<<"
";
}
cout<<endl;
system(
"pause"
);
}
⑵ 怎样用C语言打乱一个已排序的数组
如果要求不是很严格的话,感觉可以随机交换N次,每次交换,随机生成两个交换的元素的下标。
如果要求严格随机的话,感觉可以依次从数组里无放回的取数,并按照取数的先后顺序放入一个新的数组,然后新的数组就是打乱顺序之后的数组了。
⑶ 一个C语言的小问题,把一个数组随机打乱的代码,代码如下
因为i=9的时候,执行_rand(i,9);时,在函数_rand里,a为9,b为9,由于i=rand()%b; 所以i最大为8,所以在 if(i<a) goto Y; 这个地方会永远跳回到Y。就这么死循环了。
⑷ 求一个数组打乱算法,C语言版本
objectMainextendsApp{
varreverse_pairs = 0//逆序数
defmsort[T](cmp:(T, T) => Boolean)(l:List[T]):List[T] = {
defmerge(l1:List[T], l2:List[T]):List[T]=(l1, l2)match{
case(Nil, _) => l2
case(_, Nil) => l1
case(x::left1, y::left2) =>
if(cmp(x, y))
x::merge(left1, l2)
else{
reverse_pairs += l1.length
y::merge(l1, left2)
}
}
valn = l.length / 2
if(n == 0)
return l
else{
val(l1, l2) = l.splitAt(n)
merge(msort(cmp)(l1), msort(cmp)(l2))
}
}
println(msort((x:Int, y:Int) => x<y)(List(5, 4, 3, 2, 7,6 )))
println(reverse_pairs)
}
⑸ c语言如何随机打乱数组
int a[] = {3,5,7,1,4};
// 本程序考虑时间复杂度最小情况的乱序算法,O(t)=len-1
// 算法模仿彩票摇号,从全集中先取一个为第一位,再在剩余集合中取出一个为第2位,...
// 直至最后一个,只是考虑空间利用,已排序集合利用全集的空间。
int len=sizeof(a); // 全集元素数量
srand(unsigned(time(NULL))); // 摇号机准备
for(int i=len;i>1;i--) // 从全集开始摇号,直至只剩一个,已排在最后
{
int cur=len-i+(rand()%i); // 在剩余集合中摇号
int tmp=a[len-i]; // 当前序号位置挪空
a[len-i]=a[cur]; // 摇出的彩球放入当前序号
a[lcur]=tmp; // 放好剩余的彩球
}
⑹ C语言有什么办法把一定范围里的数子打乱顺序
洗牌的话自然先要从洗牌的本来面目考虑啊x_x
不过楼上的太写实了...
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void main()
{
int a[52];
srand(time(0));
a[0] = 0;
for (int i = 1; i < 52; i++)
{
int p = rand() % i;
int t = a[p];
a[p] = i;
a[i] = t;
}
}