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

生成元素间最小距离的随机序列(Matlab),matlab,Matlab,我需要在给定的间隔上生成一个给定长度的随机数序列,约束条件是两个数之间不应该有一定的距离。生成数字的间隔将大于序列的长度乘以最小距离,但不会太大,因此某些数字可能无法满足条件 这可能很简单,但我真的想不出一个解决这个问题的好办法,除了生成随机序列,然后遍历它以检查每对是否满足条件,如果不满足,则替换它们并再次检查。这似乎太长了,因为不能保证新生成的数字会满足条件,迭代本身可能需要相当长的时间 有谁能想出更好的解决方案吗?根据你的挑剔程度,有很多可能的答案。如果你不挑剔的话,这就行了 L=10;

我需要在给定的间隔上生成一个给定长度的随机数序列,约束条件是两个数之间不应该有一定的距离。生成数字的间隔将大于序列的长度乘以最小距离,但不会太大,因此某些数字可能无法满足条件

这可能很简单,但我真的想不出一个解决这个问题的好办法,除了生成随机序列,然后遍历它以检查每对是否满足条件,如果不满足,则替换它们并再次检查。这似乎太长了,因为不能保证新生成的数字会满足条件,迭代本身可能需要相当长的时间


有谁能想出更好的解决方案吗?

根据你的挑剔程度,有很多可能的答案。如果你不挑剔的话,这就行了

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];

参数取自另一个答案

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]。
则会得到N个介于0和E之间的随机数:

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

数字可能位于区间的任何位置有多重要?您可以生成随机整数并将其乘以最小距离。可能有一些方法无法从满足约束的所有可能分布中均匀采样来生成这些值。那可以接受吗?另外,你能清楚你是在生成整数还是实数(大概是用双精度近似的)还是其他一些数字类型吗?这些数字来自什么分布?还有,如果你能告诉我们你需要这些数字做什么,这将是很有帮助的。如果你的间隔大于长度x最小距离,但“不会太大”,那么它就不会是真正随机的,是吗?只是一个小的修正,在最后一行距离应该提取到“开始”为0。