【发布时间】:2018-08-23 04:56:01
【问题描述】:
假设我有一个排序的值数组:
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],这样:
-
v[i[0]] ... v[i[n-1]]指向一个唯一的数字(即不能两次指向 5) - 每个数字必须是同类中最右边的(即必须指向最后一个 5)
- 应始终包含指向最终数字(在本例中为 13)的索引。
到目前为止我已经尝试过:
- 获取最后一个唯一值的索引
- 改组索引
- 挑选出前 n 个索引
我在 C 中实现这一点,所以我可以依赖的标准 C 函数越多,代码越短越好。 (例如,shuffle 不是标准的 C 函数,但如果我必须,我必须。)
【问题讨论】:
-
如果发现唯一值不够怎么办?
-
与数组的大小相比,n 小吗?请给出一些示例尺寸。这与判断效率有关。例如。对于大小 1000 和 n==3,任何对整个数组(唯一值)进行洗牌的东西都是低效的。而对于大小 1000 和 n=100,我希望改组(例如当前存在的答案)比例如更快。跟踪已经使用的索引和值(这似乎是直接的方法)。 (@user3386109 我希望我不会攻击您的解决方案。)
-
您是在询问算法还是如何在 C 中执行此操作?这是两个独立的问题,前者可能更适合计算机科学网站。后者是题外话,因为不清楚你不明白什么。总的来说,这太宽泛了。
-
为什么说“洗牌不是线性的”?它是线性的。
-
是否有某种原因,为什么会出现多次相同的值?输入的数量会影响选择数字的概率吗?