【问题标题】:Define a vector with random steps定义具有随机步长的向量
【发布时间】:2018-09-01 05:12:52
【问题描述】:

我想创建一个具有增量随机步骤的数组,我使用了这个简单的代码。

t_inici=(0:10*rand:100);

问题是随机数在步骤之间保持不变。有没有什么简单的方法可以在每一步中改变随机数的种子?

【问题讨论】:

  • 有趣的问题,虽然你尝试显示很少理解。您正在创建一个线性间隔的向量,具有恒定的随机步长。你有什么限制?是否有最大/最小步长?最大/最小样本?你已经通过给出一个开始和停止的固定值来限制你的随机性
  • 这里是更多维度的概括...mathworks.com/matlabcentral/fileexchange/…

标签: arrays matlab random


【解决方案1】:

如果您有一定的积分数,比如nPts,那么您可以执行以下操作

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 版本更好,似乎更好地反映了所需的行为......
【解决方案2】:

我的第一种方法是生成 N-2 个样本,其中 N 是随机所需的样本数量,对它们进行排序,然后添加极值:

N=50;
endpoint=100;
initpoint=0;
randsamples=sort(rand(1, N-2)*(endpoint-initpoint)+initpoint);
t_inici=[initpoint randsamples endpoint];

但是不确定这是多么“均匀随机”,因为您正在“伪造”最后 2 个数据以包含极值。这会以某种方式扭曲纯粹的随机性(我认为)。如果您不一定对包含极值感兴趣,则只需删除最后一行并生成 N 个点。这将确保它们确实是随机的(或者像 MATLAB 可以创建它们一样随机)。

【讨论】:

    【解决方案3】:

    这是“均匀随机”的替代解决方案

    [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)=[];
    

    在我看来,它非常适合您的未知步骤尝试,从 0 开始,但不一定以 100 结束。

    【讨论】:

    • 谢谢,我没有很好地解释我需要实现什么,但这是更合适的,因为我不想设置步数。也感谢所有其他答案。
    • 很高兴,很高兴我能提供帮助。 @琼
    【解决方案4】:

    从您的代码看来,您需要一个在每两个条目之间变化的统一随机步骤。这意味着向量将具有的条目数是事先未知的。

    一种方法如下。这与Hunter Jiang's answer 类似,但为了减少循环迭代次数,而不是逐个添加条目。

    1. 猜测一些必填项,n。任何值都可以,但较大的值会导致迭代次数减少,并且可能会更有效。
    2. 将结果初始化为第一个值。
    3. 生成n 条目并将它们连接到(临时)结果。
    4. 查看当前条目是否已经太多。
    5. 如果是,则根据需要进行剪切并输出(最终)结果。否则返回第 3 步。

    代码:

    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
    

    【讨论】:

    • 谢谢,这是另一个可以减少执行时间的有趣答案。
    猜你喜欢
    • 2017-07-02
    • 2012-10-21
    • 2021-02-26
    • 1970-01-01
    • 2013-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多