兰德函数在MATLAB/倍频程中是否产生过0或1的值?

兰德函数在MATLAB/倍频程中是否产生过0或1的值?,matlab,random,octave,Matlab,Random,Octave,我正在寻找一个函数,它将生成介于0和1之间的随机值。我使用八度音阶中的rand()函数生成了120000个随机值,但没有一次将值0或1作为输出。rand()是否曾经产生过这样的值?如果没有,是否还有其他功能可用于实现所需的结果?我刚刚尝试了以下方法: octave:1> max(rand(10000000,1)) ans = 1.00000 octave:2> min(rand(10000000,1)) ans = 3.3788e-08 没有严格地给我0,所以要注意浮点操

我正在寻找一个函数,它将生成介于
0
1
之间的随机值。我使用八度音阶中的
rand()
函数生成了120000个随机值,但没有一次将值
0
1
作为输出。
rand()
是否曾经产生过这样的值?如果没有,是否还有其他功能可用于实现所需的结果?

我刚刚尝试了以下方法:

octave:1> max(rand(10000000,1))
ans =  1.00000

octave:2> min(rand(10000000,1))
ans =    3.3788e-08
没有严格地给我0,所以要注意浮点操作

编辑

尽管我说过,要当心浮点运算,但我确实爱上了它。正如Chris所指出的:

format long g
octave:1> a=max(rand(1000000,1))
a =    0.999999711020176

正如@rayryeng所建议的那样,它产生一个接近于1的浮点数,而不是相等的浮点数。

如果您阅读了
rand
中的文档,并且,它是
(0,1)
之间的打开的间隔,因此不应该生成数字0或1

但是,您可以生成一组随机的整数,然后对值进行规格化,使其介于
[0,1]
之间。因此,也许可以使用类似于
randi
(,)的方法,其中它生成从1到给定最大值的整数值。使用此方法,定义此最大值,然后减去1,再除以此最大偏移量,得到
[0,1]
之间的值,包括:

max_num = 10000; %// Define maximum number
N = 1000; %// Define size of vector
out = (randi(max_num, N, 1) - 1) / (max_num - 1); %// Output
如果希望它更像
rand
,但包含0和1,请将
max_num
变量设置得相当大

从数学上讲,如果从封闭区间[01]上的(连续)均匀分布中取样,则值0和1(或任何值,事实上)的概率严格为零

以编程方式

  • 如果您有一个随机生成器,它在闭合区间[01]上生成类型为
    double
    的值,则获得值0或1的概率不是零,但它太小,可以忽略不计

  • 如果随机生成器从开放区间(0,1)生成值,则获得值0或1的概率严格为零

  • 所以概率要么严格为零,要么很小,可以忽略不计。因此,您不必担心这一点:在任何情况下,出于实际目的,概率都为零。即使
    rand
    属于上述类型(1),因此可以产生
    0
    1
    ,产生它们的概率也很小,以至于您“永远”看不到这些值


    听起来奇怪吗?任何数字都会发生这种情况。你“永远”也不会看到
    rand
    输出正好是1/4。有太多可能的输出,所有这些输出的可能性都相等,因此任何给定输出的概率几乎为零。

    rand
    从开放区间
    (0,1)
    生成数字,该区间不包括0或1,因此您永远不应该获得这些值。。这在以前的版本中有更清楚的说明,但在
    rand
    的帮助文本中仍然有说明(键入
    help rand
    而不是
    doc rand

    然而,由于它产生双精度,它实际产生的值数量有限。精确设置取决于所使用的RNG算法。对于默认算法Mersenne twister,可能的值都是开放区间
    (0,1)
    内2^(-53)的倍数。(有关其他生成器的信息,请参见
    文档RandStream.list
    ,然后参见“选择随机数生成器”)

    请注意,2^(-53)是eps/2。因此,它相当于从封闭区间
    [2^(-53)、1-2^(-53)]
    [eps/2、1-eps/2]
    中提取

    通过减去eps/2并除以1-eps,您可以将此间隔缩放为
    [0,1]
    。(使用
    format hex
    显示足够的精度,以检查位级别的精度)

    因此
    x=(rand-eps/2)/(1-eps)
    应该给出闭合区间的值
    [0,1]


    但我要提醒一句:他们花了很多精力来确保,
    rand
    的输出在
    (0,1)
    中给出了任何给定双精度的适当分布,如果你应用我建议的缩放,我认为你不会在
    [0,1]
    上得到同样好的属性。我对浮点数学和RNG的知识还不足以解释为什么,或者你可能会怎么做。

    虽然不是直接针对这里的问题,但我发现链接到这篇文章很有帮助,它有一个使用
    r=rand>0.5
    生成1和0的单行线,你可能想检查一下这是否真的是
    1.0
    ,或者只是浮点数的四舍五入版本。捕捉得好,不是1,只是倍频程的显示,我会修正answer@brodroll-尝试更改显示格式。Do
    格式长g然后再次尝试运行代码。我已经运行过好几次了,但从来没有得到过确切的
    1.0
    。这里有一个运行在我的八度音阶实例上。顺便说一句,你的答案是+1<代码>倍频程:1>格式长g;倍频程:2>最大(兰特(100000000,1))ans=0.999999988570948倍频程:3>格式倍频程:4>ans ans=1.00000
    Yup进行了更改,以供进一步参考和完成。谢谢你们的提醒!很好的技巧+1:)顺便说一句,我在文档中没有看到打开间隔部分。“我遗漏了什么吗?”SanthanSalai-在MatlabR2013A上我的文档上。我刚查了MathWorks上的MATLAB文档,你说得对。@SanthanSalai-哦。感谢+1:)@rayryeng尽管文档页面出于某种原因似乎删除了有关打开间隔的详细信息,但它仍保留在帮助中(
    help rand
    在R2015a中)。@rayryeng:非常感谢。这真的很有用:)
    rand
    不是从封闭区间
    [0,1]
    采样,而是从开放区间
    (0,1)
    采样。它不应该(不仅仅是很少)刺激