有人可以告诉我如何使用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元素位置的开头。
Examlpe:
unshuffle(arr.begin(), arr.end(), seed);
输出: 0,1,2,3,4
谢谢
答案 0 :(得分:2)
该设计如何(使用虚拟类Array
可能是std::array
):
您有一个课程ReversableShuffledArray
。此类具有两个成员Array<Datatype> data
和Array<size_t> shuffle_order
,以及方法void shuffle
和Datatype& operator[]
。
通过以某种方式(特别是move构造函数)向其提供数据来对其进行初始化,并将其放入成员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
,您可以使用相反的过程。< / p>
(但是,如果您无法控制改组,这将无济于事,但是在问题中,您写道“我使用c ++改组函数来改组数组”,所以我认为您可以。)