如何洗牌一个数组,使所有元素改变它们的位置
How to shuffle an array so that all elements change their place
我需要洗牌一个数组,这样所有数组元素都应该改变它们的位置。给定一个数组[0,1,2,3]
,可以得到[1,0,3,2]
或[3,2,0,1]
,但不能得到[3,1,2,0]
(因为2
保持不变)。我想算法不会是特定于语言的,但以防万一,我需要在c++程序中使用它(由于额外的要求,我不能使用std::random_shuffle
)。
这个怎么样?
- 分配一个数组,包含从0到arrayLength-1的数字
- 打乱数组
- 如果数组中没有元素的索引等于它的值,继续步骤4;否则重复步骤2。
- 使用洗牌数组值作为数组的索引。
For each element e
If there is an element to the left of e
Select a random element r to the left of e
swap r and e
这保证每个值不在它开始的位置,但不保证如果有重复的值,每个值都会改变。
BeeOnRope指出,虽然简单,但这是有缺陷的。给定列表[0,1,2,3],该算法无法产生输出[1,0,3,2]。
这不是随机的,但你可以旋转所有的元素至少一个位置:
std::rotate(v.begin(), v.begin() + (rand() % v.size() - 1) + 1, v.end());
如果v
在开始时是{1,2,3,4,5,6,7,8,9}
,那么在旋转后它将是,例如:{2,3,4,5,6,7,8,9,1}
或{3,4,5,6,7,8,9,1,2}
,等等。
数组的所有元素将改变位置
我有一个想法,希望它适合您的应用程序。再多一个集装箱,这个集装箱将是"地图(int,向量(int))"。键元素将显示索引,第二个元素(vector)将保存已使用的值。
例如,对于第一个元素,您将使用rand函数来查找应该使用数组中的哪个元素。如果数组的此元素已用于此索引,则将检查映射结构。
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 使用strcpy将char数组的元素复制到另一个数组
- 使用不带参数的函数访问结构元素
- C++去除前x个元素的有效方法,在不改变向量大小的情况下将第x+1个元素推到第一个
- 如何在循环中改变容器中的元素
- 改变vs中持续char*的元素
- 一个元素不能改变的非守恒向量
- 提升::p tr_向量改变元素顺序
- 为什么我的循环范围不会改变元素?
- 如果vector改变,迭代器是否指向相同的元素?或者怎么做
- 一些向量元素不会改变
- 改变一个MFC对话框元素的背景颜色
- 不能改变Cocos2d-x MenuItemToggle元素的不透明度
- 为什么矢量不改变其元素?
- 如何用键盘改变glLookat视图元素的整数值
- std::list会改变元素在内存中的位置吗?
- 在不改变索引顺序的情况下从动态数组中删除元素
- 如何洗牌一个数组,使所有元素改变它们的位置
- 在c++中,如何改变元素在一个向量中的位置,并对另一个不同的向量进行相同的改变