Performance 提高性能以生成步长范围内的随机数

Performance 提高性能以生成步长范围内的随机数,performance,matlab,random,Performance,Matlab,Random,为了确保这不是重复的,我已经签出了 我想生成特定范围内的随机数,包括步长(非连续分布) 例如,我想在-2和3之间生成随机数,其中两个连续数字之间的步长为0.02。(例如,[-2-1.98-1.96…2.69 2.98 3],因此生成的数字应该是2.96而不是2.95) 我试过这个: a=-2*100; b=3*100; r = (b-a).*rand(5,1) + a; for i=1:length(r) if r(i) >= 0 if mod(fix(r(i)),

为了确保这不是重复的,我已经签出了

我想生成特定范围内的随机数,包括步长(非连续分布)

例如,我想在-23之间生成随机数,其中两个连续数字之间的步长为0.02。(例如,[-2-1.98-1.96…2.69 2.98 3],因此生成的数字应该是2.96而不是2.95)

我试过这个:

a=-2*100;
b=3*100;
r = (b-a).*rand(5,1) + a;
for i=1:length(r)
    if r(i) >= 0
        if mod(fix(r(i)),2)
            r(i)=ceil(r(i))/100;
        else
            r(i)=floor(r(i))/100;
        end
    else
        if mod(fix(r(i)),2)
            r(i)=floor(r(i))/100;
        else
            r(i)=ceil(r(i))/100;
        end
    end
end
它是有效的

在MATLAB中有另一种方法可以实现这一点,即:

y = datasample(-2:0.02:3,5,'Replace',false)
我想知道:

  • 我如何使自己的实现更快(改进 性能)
  • 如果第二种方法更快(我觉得更快),我怎么能 使用C++中类似的实现?

  • 如果你仔细阅读,前面的答案确实涵盖了你的情况。例如,在步长为1的限制之间生成随机数。但是,让我们将其推广到任意步长,以防您不知道如何到达该步长。有几种不同的方法。这里有一个使用,我们使用默认步长1和从1到可能值的范围作为索引:

    lo = 2;
    hi = 3;
    step = 0.02;
    v = lo:step:hi;
    r = v(randi(length(v),[5 1]))
    
    如果您查看内部(在命令窗口中键入
    editdatasample
    以查看代码),您将看到它所做的事情与此答案非常相似。如果
    'Replace'
    选项为
    true
    请参见第135行(至少在R2013a中)

    如果
    'Replace'
    选项为
    false
    ,如在使用上述
    datasample
    时一样,则实际上需要使用
    randperm
    (参见第159行):

    因为在这种情况下没有替换,
    51
    是调用中可以请求的最大值数,
    r
    的所有值都是唯一的


    <>在C++中,如果你在进行科学计算,生成大量随机变量,则不应该使用<代码> RAND()。相反,您应该使用大周期随机数生成器,例如(Matlab中的默认值)。C++11包括作为的一部分。在
    rand()
    中。如果你想要快一点的东西,你应该试试这个。如果你想在C++中实现代码,你必须再问一个问题。

    如果你仔细阅读,前面的答案会覆盖你的情况。例如,在步长为1的限制之间生成随机数。但是,让我们将其推广到任意步长,以防您不知道如何到达该步长。有几种不同的方法。这里有一个使用,我们使用默认步长1和从1到可能值的范围作为索引:

    lo = 2;
    hi = 3;
    step = 0.02;
    v = lo:step:hi;
    r = v(randi(length(v),[5 1]))
    
    如果您查看内部(在命令窗口中键入
    editdatasample
    以查看代码),您将看到它所做的事情与此答案非常相似。如果
    'Replace'
    选项为
    true
    请参见第135行(至少在R2013a中)

    如果
    'Replace'
    选项为
    false
    ,如在使用上述
    datasample
    时一样,则实际上需要使用
    randperm
    (参见第159行):

    因为在这种情况下没有替换,
    51
    是调用中可以请求的最大值数,
    r
    的所有值都是唯一的


    <>在C++中,如果你在进行科学计算,生成大量随机变量,则不应该使用<代码> RAND()。相反,您应该使用大周期随机数生成器,例如(Matlab中的默认值)。C++11包括作为的一部分。在
    rand()
    中。如果你想要快一点的东西,你应该试试这个。如果你想在C++中实现代码,你必须再问一个问题。

    如果你仔细阅读,前面的答案会覆盖你的情况。例如,在步长为1的限制之间生成随机数。但是,让我们将其推广到任意步长,以防您不知道如何到达该步长。有几种不同的方法。这里有一个使用,我们使用默认步长1和从1到可能值的范围作为索引:

    lo = 2;
    hi = 3;
    step = 0.02;
    v = lo:step:hi;
    r = v(randi(length(v),[5 1]))
    
    如果您查看内部(在命令窗口中键入
    editdatasample
    以查看代码),您将看到它所做的事情与此答案非常相似。如果
    'Replace'
    选项为
    true
    请参见第135行(至少在R2013a中)

    如果
    'Replace'
    选项为
    false
    ,如在使用上述
    datasample
    时一样,则实际上需要使用
    randperm
    (参见第159行):

    因为在这种情况下没有替换,
    51
    是调用中可以请求的最大值数,
    r
    的所有值都是唯一的


    <>在C++中,如果你在进行科学计算,生成大量随机变量,则不应该使用<代码> RAND()。相反,您应该使用大周期随机数生成器,例如(Matlab中的默认值)。C++11包括作为的一部分。在
    rand()
    中。如果你想要快一点的东西,你应该试试这个。如果你想在C++中实现代码,你必须再问一个问题。

    如果你仔细阅读,前面的答案会覆盖你的情况。例如,在步长为1的限制之间生成随机数。但是,让我们将其推广到任意步长,以防您不知道如何到达该步长。有几种不同的方法。这里有一个使用,我们使用默认步长1和从1到可能值的范围作为索引:

    lo = 2;
    hi = 3;
    step = 0.02;
    v = lo:step:hi;
    r = v(randi(length(v),[5 1]))
    
    如果您查看内部(在命令窗口中键入
    editdatasample
    以查看代码),您将看到它所做的事情与此答案非常相似。如果使用
    “替换”
    选项,则应