我正在寻找能够在0
和1
之间生成随机值的函数。我在八度音阶中使用rand()
函数生成了120,000个随机值,但是一旦得到值0
或1
作为输出,我就无法生成。 rand()
是否会产生这样的价值观?如果没有,是否还有其他功能可以用来达到预期效果?
答案 0 :(得分:7)
如果您在Octave和MATLAB中阅读了rand
的文档,那么(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
如果您希望此操作更像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),因此可以生成0
和1
,但它会产生的概率很小,以至于你会# 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。