假设我们有一个 m个元素数组,我们想要随机改变 n 的位置当然,其中2< = n< = m。
例如:如果我们有 10 整数数组{1 2 3 4 5 6 7 8 9 10},我们要求 4 更改其元素随机定位,结果可能是{3 2 1 4 5 6 10 8 9 7}
在ANSI C中对此进行编程的最简单方法是什么? (伪代码也会很好)
答案 0 :(得分:0)
步骤1)。生成1到m之间的n个随机唯一数字的列表。不应对此列表进行排序。例如,对于您的示例,列表可能是[10,7,1,3]
步骤2)做类似的事情:
int save = array[list[0]];
For (i=0; i<n-1; i++) {
Array[list[i]] = array[list[i+1]];
}
Array[list[n-1]] = save;
编辑:实际上,你必须从每个列表中减去1 [无论如何]以允许从零开始的数组 - 但我相信你明白了这一点:)
答案 1 :(得分:0)
因为必须交换至少两个数字,我会首先从数组中选择两个随机数,然后交换它们。它们被添加到包含交换索引的数组中。如果有更多的交换,请选择与交换的数字不同的另一个数字,并将其与之前交换的数字交换。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void print_arr(int a[], int size) {
int i;
for (i = 0; i < size; i++) {
printf("%d ",a[i]);
}
printf("\n");
}
void swap(int a[], int i, int j) {
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
int next_idx(int swapped[], int s_count, int size) {
int n, i;
char in_arr;
while (1) {
in_arr = 0;
n = rand() % size;
for (i = 0; i < s_count; i++) {
if (swapped[i] == n) {
in_arr = 1;
break;
}
}
if (!in_arr) {
break;
}
}
return n;
}
void swap2_or_more(int a[], int size,int count) {
srand(time(NULL));
int i, j, s_count = 0;
int swapped[size];
i = rand() % size;
swapped[s_count] = i;
s_count++;
do {
j = rand() % size;
} while (i == j); // make sure indexes are different
swapped[s_count] = j;
s_count++;
swap(a, i, j);
count -= 2;
while (count) {
i = next_idx(swapped, s_count, size);
j = rand() % s_count;
swap(a, i, swapped[j]);
swapped[s_count] = i;
s_count++;
count--;
}
printf("swapped indexes:\n");
print_arr(swapped, s_count);
}
int main(void)
{
int a[] = {1,2,3,4,5,6,7,8,9,10};
swap2_or_more(a, 10, 5);
printf("array after swap:\n");
print_arr(a, 10);
return 0;
}