首页 > 解决方案 > 将随机索引挑选到排序数组中

问题描述

假设我有一个排序的值数组:

int n=4; // always lower or equal than number of unique values in array
int i[256] = {};
int v = {1 1 2 4 5 5 5 5 5 7 7 9 9 11 11 13}
// EX 1        ^         ^       ^       ^
// EX 2    ^                 ^         ^ ^
// EX 3    ^ ^           ^               ^

我想生成n 个随机索引值i[0] ... i[n-1],以便:

  1. v[i[0]] ... v[i[n-1]]指向一个唯一的数字(即不能指向 5 两次)
  2. 每个数字必须是同类中最右边的(即必须指向最后5 个)
  3. 应始终包括对最终数字(在本例中为 13)的索引。

到目前为止我已经尝试过:

  1. 将索引获取到唯一值的最后一个
  2. 洗牌索引
  3. 挑出前 n 个索引

我在 C 中实现这一点,所以我可以依赖的标准 C 函数越多,代码越短越好。(例如,shuffle不是标准的 C 函数,但如果我必须,我必须。)

标签: carraysrandom

解决方案


创建最后一个索引值的数组

int last[] = { 1, 2, 3, 8, 10, 12, 14 };

Fisher-Yates对数组进行洗牌。

从混洗后的数组中取出第一个n-1元素。

将索引添加到最终数字。

如果需要,对结果数组进行排序。


推荐阅读