##1.问题背景##
在Raptor中,有时候我们需要一些指定范围的随机数,但是我们从Raptor帮助文件中可以发现,random产生[0,1)之间的随机数,这显然是不能满足需要的,所以本篇教学探讨怎么生成任意范围的随机数。
帮助文件中的random函数介绍:
##2.实现原理##
本篇教学讨论生成[a,b)(b>a)区间上的均匀分布的随机数
-
Raptor中的random产生一个[0,1)区间上均匀分布的随机数
-
基于这种事实,y=a+(b-a)x相当于把[0,1)区间的长度拉伸为(b-a),并且把这个区间向右平移了a个长度,也就是先把[0,1)拉伸为[0,(b-a)),并且把这个区间向右移动a个单位,则得到[0,(b-a))+a=[a,b),这样我们就得到了一个从区间[0,1)到区间[a,b)的一个一一对应关系(下面给出示意图)
-
因此,任意x在[0,1)之间的随机数经过这种变换就变成[a,b)之间的随机数了
说点闲话,上面从区间[0,1)到[a,b)之间的一个一一映射,表明了一个很重要是事实![0,1)区间的点的个数和任意[a,b)区间上点的个数是一样多的!!!
示意图:
[0,1)到[3,5)的变化过程
[0,1)到[5,20)的变化过程
给出一段生成示意图的MATLAB代码,更改a和b就能显示不同区间的变化了,有兴趣可以看一看
close all;
a=3;
b=8;
x=0:0.01:1;
y1=-1*ones(size(x));
y2=0*ones(size(x));
y3=1*ones(size(x));
hold on
plot(x,y1,'b-','LineWidth',4)
plot((b-a)*x,y2,'g-','LineWidth',4)
plot((b-a)*x+a,y3,'r-','LineWidth',4);
legend('原区间','拉伸后','平移后')
title(['生成区间[',num2str(a),',',num2str(b),')','随机数示意图']);
set(gca,'ytick',[]);
set(gca,'xtick',0:1:b);
axis([0 b -3 3]);
##3.具体应用##
定义一个长度为10的一维数组,其中数据随机生成,为1到10之间的整数。
分析:
-
我们前面说了关于[0,1)区间到任意区间[a,b)的一个对应关系,这得到的是浮点数,但是要注意的是这个题目要求生成1到10之间的整数
-
因为这个是左开右闭区间,右面的b不能达到,对于生成1到10的整数来说,我们要对这个区间进行一个floor操作,floor是Raptor中向下取整函数
-
很显然,我们需要浮点数区间是[1,11),现在好了我们一下子就看出来a=1,b=11
-
根据y=a+(b-a)x,我们在Raptor中应该做的变换就是floor(1+10*random)
-
这样就得到了一个[1,10]之间的随机整数
##4.流程图与结果展示##
以上就是关于生成任意范围均匀随机数的内容,需要程序、代做程序或者有什么问题请联系QQ545030769