如何在(0…1)之间创建随机数?

7次浏览(最近30天)
伊拉尼·阿查贾马姆
伊拉尼·阿查贾马姆 2021年8月17日
有人能建议我如何在(0…1)之间创建随机数吗?

答案(2)

KSSV
KSSV 2021年8月17日
了解 兰德 .
我希望=兰德(1,10)
我万特= 1×10
0.3795 0.0287 0.4453 0.7789 0.3209 0.6367 0.2754 0.1285 0.6886 0.7143
5评论
沃尔特·罗伯森
沃尔特·罗伯森 2021年8月19日
用户希望从浮点数的均匀随机分布生成,其中源分布不包括0,但包括1,1可能与任何其他可能的输出具有相同的概率。
用户实际上没有说明他们需要的分布密度。如果他们对源集中2^52或更少的数字感到满意,那么使用randi可以相当容易地完成计算。
如果用户希望源集中有更多的2^53*值,则有必要切换到不同的表示形式,而不是ieee 754双精度。
如果用户想要源集中的2^53值,这是有可能的一点间接。
MATLAB中最常用的均匀随机数生成器是从一个源集合生成的,该源集合的值为2^53-1,比理想的值少一个。

登录以发表评论。


沃尔特·罗伯森
沃尔特·罗伯森 2021年8月19日
这需要努力才能做到。
格式长g
N=6;
温度=类型转换(重塑([randi([0(2^8-1)]),6,N,‘uint8’);兰迪([0(2^5-1)],1,N);零(1,N,‘uint8’)],[],1),‘uint64’)
temp = 6×1
6216815486836182 5783593910339116 5332195457436175 6764184342683364 8586546077226935 7892688937955983
iwant=双(温度)/flintmax;
iwant(iwant==0)=1
我万特= 6×1
0.690205169333178 0.642107912434033 0.591992616864731 0.750975320005605 0.953298115694216 0.876264498512301
不能使用rand(),因为rand()排除0和1。
您不能[直接]使用randi(),因为randi的最大跨度为2^53-2
所以…我们要做的是生成一个53位二进制数,并将其打包成一个uint64。一个53位二进制数有2^53个不同的可能值,从0到2^53-1。我们可以将该值加倍(),因为所有0到2^53的整数都可以直接以双精度表示。然后我们除以2^53以缩放到0(2^53-1)/2^53。然后我们检查0,如果我们看到它,我们将替换为1。所以现在我们有一个2^53不同数字的范围,不包括0,包括1。

标签

社区寻宝

在MATLAB Central中查找宝藏,了解社区如何帮助您!

开始狩猎!