关于随机取数

在学习CS将近三年的时间里,经常会用到一个random().
作为一个看书太少的小白,每次都是看着别人用了random(),傻傻的就记得这样可以随机了,但是具体文法还是看不懂。
今天在图书馆拿了一本《Head First Java》,看着书内诙谐幽默的叙述,对这个概念又有了进一步的认识。

random()是一个方法,它会返回介于0到1之间的值。
那我们该怎么利用它呢?
书里的例子是,先设定一个装载随机数据的容器(即数组),可以想成,我们需要一个瓶子,来装我们需要随机取出来的东西。
你看,要把东西,丢进一个大瓶子里,好了好了我们要看不见了,要伸手摸,这样才是随机,才会公平嘛!
丢进去之后呢,我们需要一个方法,能够模拟随机的条件。

random提供了一个随机的条件,因为它返回的数字就是随机的!
可是,怎样把这个随机数,与我们真正要随机物品,相关联呢?

我们可以这样,先计算,瓶子里一共有多少东西,这时候我们又有一个好伙伴啦,length
数组a,只要这样表达 ——> int x = a.length;
就代表,x是a数组的长度!换句话说,也就是,a数组里到底有多少东西。

在这里的话,我对length方法的作用产生了一些困惑。
我的初步理解,数组a是没有事先定义好长度的,不然你再length一下,干啥呢,没意义啊!
就像我们有一个固定的容器,15cm³大的方形容器,我们要放的是每块1cm³的彩色方糖,我们只放进去10块方糖,占地10cm³,我们用length取一下这个容器的大小,得出来是15.可是我们真正想要利用的是里面有多少块方糖,来随机决定取出哪一块方糖。
所以数组a定义的方式是,直接往里面放东西,东西放了多少,数组的大小就是多少,便可以利用这点来统计数组长度。

之后我做了进一步的挖掘,得出以下:
所查资料:length(a)表示矩阵a的最大的长度,即max(size(a))
假定a为一个二维数组,有行有列,那么a.length取的是整个数列有多少行。
例如定义数组char a[][] = new char[3][4],那么a.length的值就为3.这样基本应证了我的猜想,如果有不对的地方希望有人能够指出。

具体定义数组方法如下:

String[] a = {“pig”,”mouse”,”cat”,”dog”,”tiger”};

所以a.length的值为5。

在纠结完length方法后,我们再回到怎么使随机成立的问题上来。

我们现在有了random()产生的随机小数,又有了数组的长度。
为了方便理解,我们假定random()产生的随机小数是0.2,而数组的长度为5.
那么现在我们随机取一个,该怎么算呢?
结合书中写法,大概是这样:

int rand1 = (int) (Math.random() * x); //这里的x就是a.length,参照上文某行所述。

转换成容易理解的说法,就是rand1=0.2*5=1,诶,我们选出来的数字是1诶!所以我们取第二个就好啦!(因为数组从0开始)
PIA!哪有每次都那么好的事!
取个0.3呢?那算出来的rand1=1.5,这种时候该怎么办?

这里又涉及到一个知识点,int的强制转换,也是我以前学C语言的时候草草了事看过一遍但是一直没有弄清楚的地方。
其实我写到这里又开始懵逼了。。。
嗯,我们下次再谈,这里直接说吧,找到的信息是:
除了 Pascal 语言会四舍五入以外,Basic 和 C 系列的语言都是不进行四舍五入的
所以直接取整数部分,为1,我们还是要取第二个,就是mouse啦。

再换一种思维,不要用计算的思想,就拿刚刚那句↓
int rand1 = (int) (Math.random() * x);
想成,是从0-5中(不包含5,即0,1,2,3,4五个数)任取一个数字。
(敲黑板)同志们呐,这是套路!

今天的乱想就到这里啦,下次有问题我们再探索~

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据