C++ 如何使用STL对数组进行k-shuffle?

C++ 如何使用STL对数组进行k-shuffle?,c++,stl,shuffle,C++,Stl,Shuffle,我正在测试一个对k排序数组进行排序的算法(每个元素最多有k个位置偏离其正确的排序位置) 我很难生成测试数据——我不能按k位置随机交换元素,因为我可能会交换一个元素两次。我可以跟踪我交换的元素,但是我需要O(N)空间。我也可以使用大小为k+1的随机堆,但这听起来很愚蠢 STL中有什么东西可以帮我解决这个问题吗?这似乎是一个常见的问题,但我的简短研究只发现了全混洗的算法(我认为STL实现了Fisher-Yates)。这感觉很奇怪,因为准备随机测试数据不需要超高效,而且数据通常可能是任何形式。您可以将

我正在测试一个对k排序数组进行排序的算法(每个元素最多有k个位置偏离其正确的排序位置)

我很难生成测试数据——我不能按k位置随机交换元素,因为我可能会交换一个元素两次。我可以跟踪我交换的元素,但是我需要O(N)空间。我也可以使用大小为k+1的随机堆,但这听起来很愚蠢


STL中有什么东西可以帮我解决这个问题吗?这似乎是一个常见的问题,但我的简短研究只发现了全混洗的算法(我认为STL实现了Fisher-Yates)。

这感觉很奇怪,因为准备随机测试数据不需要超高效,而且数据通常可能是任何形式。您可以将测试值作为给出正确位置范围的元素或对的正确位置。例如,成对数组:

  • 1,1
  • 2,4
  • 2,4
  • 2,4
  • 5,6
  • 5,6
  • 7,7
  • 将随机生成器的状态存储在某个位置

    选择两个随机元素,其位置与另一个元素的原始位置(或范围)的距离不超过k个位置,然后交换。重复N次,测试数据就准备好了


    如果您以后需要获得相同的序列,请恢复随机生成器状态并重复该算法。

    下次请在要求我们为您完成其余工作之前,做更多的“简短研究”。这将洗牌整个阵列,我需要元素与正确排序的位置保持至少k个点。@racarate它不会对整个数组进行排序,除非您愿意,它会对给定的范围进行洗牌。此外,next_置换对于测试数据来说并不好,因为它每次只返回相同的序列。