我需要在给定的时间间隔上生成一个给定长度的随机数序列,其约束是两个数之间的距离不得超过两个。生成数字的时间间隔将大于序列的长度乘以最小距离,但不会相差很多,因此某些数字可能会导致条件失败。
这可能很简单,但是除了生成随机序列,然后遍历它来检查每对是否满足条件,否则我真的想不出解决此问题的好方法,如果不满足,请替换它们并检查再次。似乎太长了,因为无法保证新生成的数字将满足该条件,并且迭代本身可能会花费一些时间。
谁能想到更好的解决方案?
很多可能的答案,取决于您的挑剔程度。如果您不挑剔,这会起作用
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].'
,您将得到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