【发布时间】:2017-02-01 12:03:09
【问题描述】:
我想以随机顺序不改组生成序列[0...1'000'000]的数组。
这表示我不想做:
int arr[1000000];
for (int i = 0; i < 1000000; i++)
{
arr[i] = i;
}
shuffle(arr);
shuffle(arr);
我想弄清楚如何在没有“黑盒”shuffle 功能的情况下做到这一点。我也不想在1 和1'000'000 之间随机选择一个索引,因为在编号999'999 上只有1/1'000'000 机会继续。
我一直在想一个解决方案,我认为关键是并行数组和向后循环,然后使用模数来限制你还没有去过的索引,但是我不能保证我得到的价值是独一无二的。
我也不想使用 HashSet 或 TreeSet 实现。
【问题讨论】:
-
您想要生成 1M 个数字的随机排列。这就是问题定义,我说的对吗?为什么您认为在您定义的约束范围内有解决方案?
-
是的。我想用从
1到1M的值填充一个 1M 大小的数组,没有任何重复,并且在不使用洗牌算法的情况下以良好的 O 复杂度完成这一切。 -
洗牌是准确地做到这一点的方式。您对这种技术有什么问题?
-
你可以有一个理论算法,从O(n!)个排列中选择一个哥德尔编码的排列。但当然 n=1M 是不可行的。
-
随机选择不重复的
1,...,n几乎是随机播放的定义,无论您喜欢与否,您想出的任何算法都将是随机播放。