Q:编写程序,接受参数m,n;将大小问m 的数组,打乱n次,而且每次打乱之前都将数组初始化为a[i]=i,打印一个m*m的表格,对于输出的【i,j】处的数字表示,i打乱后落到位置j的次数,预计正确的输出结果大约为m/n;
A:
//v乱序检查;
void ShuffleTest(int m, int n)
{
vector<int> a(m);
//int *a = new int[m];
int *mn=new int[n*m];
int *sum = new int[m*m];
for (int i = 0; i < m;i++)
{
a[i] = i;
}
for (int i2 = 0; i2 < n*m;i2++)
{
mn[i2] = 0;
}
for (int i3 = 0; i3 < m*m;i3++)
{
sum[i3] = 0;
}
for (int j = 0; j < n;j++)
{
random_shuffle(a.begin(), a.end());
for (int p = 0; p < m;p++)
{
mn[j*m+p] = a[p];
}
for (int q = 0; q < m;q++)
{
a[q] = q;
}
}
int record=0;
for (int t = 0; t < m;t++)
{
int temp = a[t];
do
{
for (int col = 0; col < n; col++)
{
if (mn[col*m + record] == temp)
{
sum[t*m + record]++;
}
}
record++;
} while (record<m);
record = 0;
}
for (int c = 0; c < m*m;c+=m)
{
for (int c1 = 0; c1 < m;c1++)
{
cout << sum[c+c1] << " ";
}
cout << endl;
}
}
当m=10,n=1000时:输出结果
983 998 993 996 1057 1006 1011 1028 979 949
1016 1016 992 1025 991 960 956 1011 1000 1033
1012 943 1028 1024 943 1037 972 1009 1052 980
1004 1029 1017 1000 977 978 995 989 979 1032
968 1004 961 1011 1043 1028 1019 954 984 1028
1006 999 992 1032 1019 978 991 980 1008 995
987 932 1035 987 1034 1005 1017 998 972 1033
1066 1005 981 972 967 1035 1019 985 1024 946
942 1041 1004 953 984 1001 1008 1033 993 1041
1016 1033 997 1000 985 972 1012 1013 1009 963