撤消或取消随机播放c ++随机播放功能

时间:2019-02-06 10:26:13

标签: c++ arrays

有人可以告诉我如何使用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

谢谢

1 个答案:

答案 0 :(得分:2)

该设计如何(使用虚拟类Array可能是std::array):

您有一个课程ReversableShuffledArray。此类具有两个成员Array<Datatype> dataArray<size_t> shuffle_order,以及方法void shuffleDatatype& 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 ++改组函数来改组数组”,所以我认为您可以。)