使用随机步骤定义矢量

时间:2018-03-22 16:48:23

标签: arrays matlab random

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

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

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

4 个答案:

答案 0 :(得分:5)

如果您有一定数量的积分,请说<?xml version="1.0" encoding="UTF-8"?> <project> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.0.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> ... <properties> ... <log4j2.version>2.8.2</log4j2.version> ... </properties> ... </project> ,那么您可以执行以下操作

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

这种方法可能较慢,但仍然相当快,更好地代表了你问题中的行为。

答案 1 :(得分:3)

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

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

然而不确定如何&#34;均匀随机&#34;这是,因为你是&#34;假装&#34;最后2个数据,包括极值。这会以某种方式扭曲纯粹的随机性(我认为)。如果你不一定对包含极值有兴趣,那么只需删除最后一行并生成N个点。这将确保它们确实是随机的(或者像MATLAB一样随机创建它们)。

答案 2 :(得分: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结束。

答案 3 :(得分:2)

从您的代码中,您似乎想要一个随机的步骤,每两个条目之间会有所不同。这意味着向量将具有的条目数量是事先未知的。

这样做的方法如下。这与Hunter Jiang's answer类似,但是批量添加条目而不是逐个添加,以减少循环迭代次数。

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

    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