⑴ 用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;
}
}