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

Che*_*rry 11 random matlab octave

我正在寻找一个能够在0和之间生成随机值的函数1.我通过使用rand()八度音程中的函数生成了120,000个随机值,但没有一次获得值01作为输出.有rand()没有产生这样的价值?如果没有,是否还有其他功能可用于达到预期效果?

ray*_*ica 9

如果你读的文档rand在两个八度MATLAB,它是一个开放的间隔(0,1),所以没有,它不应该产生数字0或1.

但是,您可以生成一组随机整数,然后将值标准化,使它们介于两者之间[0,1].所以也许使用类似randi(MATLAB docs,Octave 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
Run Code Online (Sandbox Code Playgroud)

如果你想让它更像是rand包括0和1,那么使max_num变量非常大.

  • @rayryeng尽管doc页面由于某种原因似乎已经删除了关于开放区间的细节,但它仍然在帮助中(R2015a中的`help rand`). (3认同)
  • 很好的技巧+1 :) BTW,我没有在文档中看到**open interval**部分.我错过了什么吗? (2认同)

Lui*_*ndo 6

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

以编程方式

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

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

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

这听起来很奇怪吗?嗯,任何数字都会发生这种情况。您“永远”也不会看到rand精确地输出 1/4。有这么多可能的输出,所有这些输出的可能性都相等,以至于任何给定输出的概率几乎为零


Sam*_*rts 5

rand开放区间产生数字(0,1),不包括0或1,所以你永远不应该得到这些值.这在以前的版本中更清楚地记录了,但它仍然在帮助文本中说明rand(类型help rand而不是doc rand).

但是,由于它产生双精度,因此实际产生的值只有有限数量.精确集取决于所使用的RNG算法.对于Mersenne Twister,默认算法,可能的值都是在开放区间内的2 ^( - 53)的倍数(0,1).(有关doc RandStream.list其他发电机的信息,请参阅,然后选择"随机数发生器").

注意2 ^( - 53)是eps/2.因此,它相当于从闭合间隔绘制[2^(-53), 1-2^(-53)],或[eps/2, 1-eps/2].

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

所以x = (rand-eps/2)/(1-eps)应该给你关闭间隔的价值[0,1].

但是我应该谨慎一点:他们已经付出了很多努力来确保输出rand给出任何给定双精度的适当分布(0,1),并且我认为你不会得到同样好的属性[0,1]如果您应用我建议的缩放比例.我对浮点数学和RNG的了解不能解释为什么,或者你可能会对此做些什么.

  • @Daniel不,`rand`(当使用Mersenne Twister算法时)返回的最小值是2 ^( - 53)或eps/2,正如我在答案中提到的那样.这在我在答案中提到的doc页面中有记录. (2认同)