兰德函数在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(或任何值,事实上)的概率严格为零
以编程方式
double
的值,则获得值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)
采样。它不应该(不仅仅是很少)刺激