下面的程序将产生有 n 个元素的随机序列。
#include <stdio.h>
#include <stdlib.h>
// rpermute() 返回一个 0..n-1 的随机序列
int * rpermute(int n) {
int *a = malloc(n*sizeof(int));
int k;
for (k = 0; k < n; k++)
a[k] = k;
for (k = n-1; k > 0; k--) {
int j = rand() % (k+1);
int temp = a[j];
a[j] = a[k];
a[k] = temp;
}
return a;
}
// 每行输出 8 个元素
int printarray(int n, int *a) {
int k = 0;
// 这里本来是要使用数组,但是数组的长度不能是变量,所以要手动开辟内存
a = (int *)malloc(n*sizeof(int));
for (k = 0; k < n; k++) {
printf("%6d ", a[k]);
if (k % 8 == 7)
printf("\n");
}
return 0;
}
int main(void) {
int limit = 6;
int *a;
int k;
// 输出 7 行
for (k = 0; k < 7; k++) {
a = rpermute(limit);
printarray(limit, a);
printf("\n");
}
return 0;
}
可能的输出结果:
5843040 5838560 1163026258 1230195030 859655759 3354723
5847144 5838560 1176530273 1936026729 947398688 1342187830
5847144 5838560 842216502 1547322173 1735357008 544039282
5847144 5838560 1400006007 1819043176 774993500 1867340848
5847144 5838560 2035482725 1835365491 1986622020 977485157
5847144 5838560 1952531568 1867275361 1550606691 1886217556
5847144 5838560 1313423693 2054122813 1635346792 1129327982
注意:笔者在VC6.0下编译,发现输出的所有数都是一样的,然后在 C-Free 5.0 下调用 VC 6.0 的编译器输出结果正常。