谁能告诉我如何使用 C++ 洗牌函数撤消或取消洗牌数组?可以通过此链接找到它:http://www.cplusplus.com/reference/algorithm/shuffle/
我想做的是撤消我打乱的数组。 我使用 C++ suffle 函数来打乱我的数组,并寻找一个函数来取消打乱这个数组。
示例:array<int, 5> arr{0,1,2,3,4};
shuffle(arr.begin(), arr.end(), seed);
可能的输出: 4,0,2,1,3
然后我需要 unshuffle 函数来撤消 arr 元素的位置,就像在开始时一样。
示例:
unshuffle(arr.begin(), arr.end(), seed);
输出: 0,1,2,3,4
谢谢
最佳答案
这个设计怎么样(使用虚构类 Array
可能是 std::array
):
你有一个类 ReversableShuffledArray
.这个类有两个成员,Array<Datatype> data
和 Array<size_t> shuffle_order
和方法 void shuffle
和 Datatype& operator[]
.
它通过以某种方式(尤其是移动构造函数)向其提供数据来初始化,并将数据放入成员 data
中。 .此时,它创建了shuffle_order
的内容。 ,其中包含 {0,1,2,3....}
并且与 data
大小相同.
当 shuffle
被称为,不是 data
但是shuffle_order
被打乱。
operator[](size_t index)
由 return data[shuffle_order[index]];
定义.就那么简单。 data
本身永远不会被洗牌。
(应该很清楚如何进行非混洗访问,所以我不会执行它。)
当然,这也可以在没有类的情况下通过程序完成。
或者,您可以再次打乱计数,例如 shuffle_order
,用它把它应用到有问题的数组上,然后创建另一个数组 reverse_shuffle_order
从中您可以使用相反的过程。
(如果您无法控制改组,这对您没有帮助,但是在问题中,您写道“我使用 C++ suffle 函数来改组我的数组”,所以我假设您可以。)
关于c++ - 撤消或取消随机播放 C++ 随机播放函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54551330/