rand函数是否在MATLAB / Octave中产生0或1的值?

时间:2015-04-23 04:19:04

标签: matlab random octave

我正在寻找能够在01之间生成随机值的函数。我在八度音阶中使用rand()函数生成了120,000个随机值,但是一旦得到值01作为输出,我就无法生成。 rand()是否会产生这样的价值观?如果没有,是否还有其他功能可以用来达到预期效果?

5 个答案:

答案 0 :(得分:7)

如果您在OctaveMATLAB中阅读了rand的文档,那么(0,1)之间的打开区间就是如此,所以不,它不应该生成数字0或1。

但是,您可以生成一组随机整数,然后将值标准化,使它们位于[0,1]之间。所以也许使用像randiMATLAB docsOctave docs)之类的东西,它生成从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变量非常大。

答案 1 :(得分:5)

rand打开间隔(0,1)生成数字,其中不包含0或1,因此您永远不应该获取这些值。这更明确地记录在以前的版本,但仍在rand的帮助文本中说明(类型help rand而不是doc rand)。

但是,由于它会产生双精度数,因此实际产生的值只有有限数量。精确集取决于所使用的RNG算法。对于Mersenne twister,默认算法,可能的值都是在开放区间(0,1)内的2 ^( - 53)的倍数。 (有关其他发电机的信息,请参阅doc 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的了解并不能解释为什么,或者你可以对此做些什么。

答案 2 :(得分:4)

数学,如果您在闭合区间[0 1] 上从(连续)均匀分布中采样,则值0和1(或任何值,实际上)概率严格为0.

编程

  • 如果您的随机生成器在关闭区间[0 1]上生成double类型的值,则获取值0或1的概率为不是零,但它如此之小,可以忽略

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

因此,概率要么严格为零,要么可以忽略不计。因此,您不必担心:在任何一种情况下,出于实际目的,概率为零。即使rand属于类型(1),因此可以生成01,但它会产生的概率很小,以至于你会# 34;从未"看到那些价值观。

听起来有点奇怪吗?好吧,任何数字都会发生这种情况。你"永远"看到rand也输出正好1/3。有很多可能的输出,所有这些输出同样可能,任何给定输出的概率几乎为零

答案 3 :(得分:2)

我刚试过这个:

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

octave:2> min(rand(10000000,1))
ans =    3.3788e-08

没有严格给我0,所以要注意浮点运算。

修改

即使我说过,注意浮点运算我确实为此而堕落。正如@eigenchris指出的那样:

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

正如@rayryeng建议的那样,它会在更改精度后立即看到,它会产生一个浮点数 close ,而不是相等,正如@rayryeng建议的那样。

答案 4 :(得分:1)

尽管这里不直接讨论这个问题,但我发现链接到此SO帖子Octave - random generate number很有帮助,该帖子有一个衬里,可以使用r = rand > 0.5生成1和0。