【发布时间】:2012-09-17 13:41:55
【问题描述】:
假设您想以随机顺序遍历序列 [0 到 n],只访问每个元素一次。有没有办法在 O(1) 内存中执行此操作,即不使用 std::iota 创建 [1..n] 序列并通过 std::random_shuffle 运行它?
以随机顺序输出序列的某种迭代器将是最佳的。
一个要求是应该可以通过选择另一个种子来获得另一个随机顺序。
【问题讨论】:
-
n的值是否有上限? -
理论上,在 [0, n] 范围内的均匀分布的随机数可以完成这项工作。但是,我不确定如何使用 C++11 随机工具为此任务编写 正确 代码。
-
@AraK 均匀分布的 PRNG 是否会只发射每个元素一次?
-
我认为你不能按照你的要求去做。但是你可以通过创建一个指向你元素的向量来最小化内存占用并在上面使用
std::random_shuffle。 -
请注意,即使您不能在 O(1) 内存中执行此操作,如果您可以接受并忽略重复,您也可以降至
n位(可能需要更长的时间,并且可能如果您的 PRNG 足够有限,甚至会永远循环)。这将带您走很长一段路,您只需要 32 分之一的空间来显式存储每个数字(假设为 32 位整数)。
标签: c++ stl iterator complexity-theory permutation