生成元素之间距离最小的随机序列(Matlab)

时间:2015-08-12 17:03:28

标签: matlab

我需要在给定的时间间隔内生成给定长度的随机数序列,其约束条件是两个数字之间不应该在一定距离内。生成数字的时间间隔将大于序列的长度乘以最小距离,但不会太多,因此某些数字可能会使条件失败。

这可能是微不足道的,但除了生成随机序列之外,我无法真正想到这个问题的良好解决方案,然后通过迭代来检查每对是否满足条件,如果没有,则替换他们再次检查。这似乎太长了,因为无法保证新生成的数字符合条件,迭代本身可能需要相当长的时间。

有人能想到更好的解决方案吗?

2 个答案:

答案 0 :(得分:2)

很多可能的答案,取决于你的挑剔程度。如果你不挑剔,那就行了

L=10;  %length of interval
d=1;   %minimum distance
N=9;   %number of points
E=L-(N-1)*d;  %excess space for points

%generate N+1 random values; 
Ro=rand(N+1,1);     %random vector
%normalize so that the extra space is consumed
% extra value is the amount of extra space "unused"
Rn=E*Ro(1:N)/sum(Ro); %normalize

%spacing of points
S=d*ones(N,1)+Rn;  

%location of points, adjusted to "start" at 0
P=cumsum(S)-1

典型的序列是

P =[
   0.060612
   1.4073
   2.676
   3.7901
   4.9476
   6.0333
   7.2426
   8.5684
   9.9247];

答案 1 :(得分:0)

从其他答案中获取的参数

L=10;  %length of interval
d=1;   %minimum distance
N=9;   %number of points
E=L-(N-1)*d;  %excess space for points

现在想象您已经有了一个解决方案P。如果现在减去[0:d:(N-1)*d].',您将得到0到E之间的N个随机数:

P-[0:d:(N-1)*d].'

ans =

    0.0606
    0.4073
    0.6760
    0.7901
    0.9476
    1.0333
    1.2426
    1.5684
    1.9247

这是我们可以轻松生成的东西。然后添加我们之前减去的值:

>> sort(rand(1,N)*E).'+[0:d:(N-1)*d].'

ans =

    0.0689
    1.3737
    2.6342
    3.7631
    4.8775
    6.3897
    7.5310
    8.5904
    9.9004