【发布时间】:2019-04-17 02:25:49
【问题描述】:
我正在尝试编写一个对包含重复元素的数组进行洗牌的函数,但要确保重复元素彼此之间不会太接近。
此代码有效,但对我来说似乎效率低下:
function shuffledArr = distShuffle(myArr, myDist)
% this function takes an array myArr and shuffles it, while ensuring that repeating
% elements are at least myDist elements away from on another
% flag to indicate whether there are repetitions within myDist
reps = 1;
while reps
% set to 0 to break while-loop, will be set to 1 if it doesn't meet condition
reps = 0;
% randomly shuffle array
shuffledArr = Shuffle(myArr);
% loop through each unique value, find its position, and calculate the distance to the next occurence
for x = 1:length(unique(myArr))
% check if there are any repetitions that are separated by myDist or less
if any(diff(find(shuffledArr == x)) <= myDist)
reps = 1;
break;
end
end
end
这对我来说似乎不是最理想的,原因有以下三个:
1) 在找到解决方案之前,可能不需要反复洗牌。
2) 如果没有可能的解决方案(即将 myDist 设置得太高而无法找到适合的配置),这个 while 循环将永远持续下去。关于如何提前抓住这个的任何想法?
3) 必须有一种比循环遍历每个唯一值更简单的方法来确定数组中重复元素之间的距离。
我将不胜感激第 2 点和第 3 点的答案,即使第 1 点是正确的并且可以一次性完成。
【问题讨论】:
-
例如,如果给定数组有 8 种可能的改组,您的算法是否必须只找到一种解决方案,或者以 1/8 的概率随机给您一个改组?第二种情况更难达到。
-
你知道忌排序吗?它试图通过随机化来对数组进行排序,然后检查它是否已排序,如果没有,则再次对其进行随机化。这显然不是任何人都应该选择的排序算法,但你所做的听起来非常相似(有点弱,承认)。随机化是否必要?或者会,例如最大化
sum(abs(diff(shuffledArr)))就足够了吗? -
@obchardon 任何解决方案都可以。
-
@NickyMattsson:从来没有听说过bogey sort,谢谢你的提示!在这种情况下,随机化是必要的,因为这是为心理实验创建随机顺序的刺激。不幸的是,最大化距离不能满足我使刺激呈现自然(即伪随机)的目标。
-
如果数组不是太大,您可以生成所有排列,保留满足最小距离的排列,然后选择一个。这是一个选择吗?
标签: arrays matlab random shuffle