我想创建一个具有递增随机步骤的数组,我使用了这个简单的代码。
t_inici=(0:10*rand:100);
问题是随机数在步骤之间保持不变。有没有简单的方法在每个步骤中更改随机数的种子?
我想创建一个具有递增随机步骤的数组,我使用了这个简单的代码。
t_inici=(0:10*rand:100);
nPts = 10; % Could use 'randi' here for random number of points
lims = [0, 10] % Start and end points
x = rand(1, nPts); % Create random numbers
% Sort and scale x to fit your limits and be ordered
x = diff(lims) * ( sort(x) - min(x) ) / diff(minmax(x)) + lims(1)
这种方法总是包括您的终点,而0:dx:10
的方法则不一定包括。
如果您有一些最大点数限制,比如nPtsMax
,那么您可以执行以下操作:
nPtsMax = 1000; % Max number of points
lims = [0,10]; % Start and end points
% Could do 10* or any other multiplier as in your example in front of 'rand'
x = lims(1) + [0 cumsum(rand(1, nPtsMax))];
x(x > lims(2)) = []; % remove values above maximum limit
这种方法可能会慢一些,但仍然相当快,并更好地代表了您问题中的行为。
x
需要在多个地方使用,所以必须预先定义。我实际上认为我的更新的cumsum
版本甚至更好,似乎更能反映出所期望的行为... - WolfieN=50;
endpoint=100;
initpoint=0;
randsamples=sort(rand(1, N-2)*(endpoint-initpoint)+initpoint);
t_inici=[initpoint randsamples endpoint];
然而我不确定这样做是否真正是“均匀随机”的,因为你在“伪造”最后2个数据,以包括极值。这将在某种程度上扭曲纯随机性(我想)。如果您不一定要包含极值,那么只需删除最后一行并生成N个点即可。这将确保它们确实是随机的(或者尽可能接近MATLAB可以创建的随机数)。
[initpoint,endpoint,coef]=deal(0,100,10);
t_inici(1)=initpoint;
while(t_inici(end)<endpoint)
t_inici(end+1)=t_inici(end)+rand()*coef;
end
t_inici(end)=[];
n
。任何值都可以,但大的值会导致更少的迭代次数,可能更有效。n
个条目并将它们连接到(临时)结果中。代码:
lower_value = 0;
upper_value = 100;
step_scale = 10;
n = 5*(upper_value-lower_value)/step_scale*2; % STEP 1. The number 5 here is arbitrary.
% It's probably more efficient to err with too many than with too few
result = lower_value; % STEP 2
done = false;
while ~done
result = [result result(end)+cumsum(step_scale*rand(1,n))]; % STEP 3. Include
% n new entries
ind_final = find(result>upper_value,1)-1; % STEP 4. Index of first entry exceeding
% upper_value, if any
if ind_final % STEP 5. If non-empty, we're done
result = result(1:ind_final-1);
done = true;
end
end