00:00
好了同学,那咱们开始上课了啊,我们上午呢,在说到最后啊,这块有一个什么呀,叫做随机数是不是,那这个随机数呢,我们写了第一个例子,我们创建了一个random对象,是不是Java YouTube这个包下的,然后呢,调用我们next int这个方法来随机产生一个int类型的哎数据,然后呢,还有一个方法呢,叫next int可以传一个参数,这个参数呢,我们假如说传个101,那就表示这个随机数啊可以怎么着啊,生成零到100之间的随机数啊,但是不包括这个101,那么在这里呢啊,我布置了一个算是一个题目吧,啊这个题目呢,让大家中午呢有去想一想啊,不知道大家中午有没有去想。那么这个生成五个不重复的随机数是吧,重复的话呢,重新生成对吧,最终是生成五个随机随机数放到一个数组当中啊,那么中午的时候有同学给我发过来,我觉得非常不错啊,写完了给我发过来了啊,非常非常棒啊,非常棒,嗯这样的,嗯,不可能说最后就不了业啊。像这种情况是吧,一万五一万六一万七的啊呃,都是这个级别的,所以说呢,咱们大家努力啊,多努力啊,这块的话,我觉得嗯,没没问题啊,没问题,努力去学,努力去写,先不用管别的啊,先不用管别的,那行了,那这块的话,咱们来一起写一写吧,行吧,哎,生成五个不重复的随机数,那行吧,那咱就生成呗。
01:22
是不是首先第一个我们在这准备一个什么,准备一个长度,为什么五的长度为五的一为数组,是不是哎,一为数组。New一个int来接下来写个五,这是长度为五呗,是吧,然后接下来我们是不是就是循环对吧,循环生成什么随机数对吧,然后将。就是呃,生成随机数,先去生成吧,啊,循环去生成随机数,但是这个随机数呢,它有可能是存在,也有可能怎么着啊,它不存在。对吧,啊,有可能它,呃,这个在这个数组当中啊,它有可能存在,也有可能怎么着啊,它不存在啊,嗯,那这块咱们来看一下吧。
02:07
嗯。怎么做呀,各位Y要循环死循环是吗?我们先写个死循环吧,行吧,哎循环或者说呃,用for也行,对吧?哎,但是Y循环的话,咱们写个死循环来一直循环让它干啥呀,去生成呗,怎么生成啊,我们可以在这儿创建一个什么,哎,创建呃。Random对象对吧?哎,把random对象创建出来啊,那创建这个random对象的话,应该是random random,然后new一个什么呀,我们叫做random啊。那溜完之后呢,这边我们该导的导进来啊,导进来out加回车啊,把这个就导进来了,那导进来之后呢,接下来我们在这儿要生成。五个不重复的随机数。
03:00
那咱们给个范围吧,行吧。啊,这个随机数的话,咱们就生成是。零到100的呗,行不行,那还有一个问题,各位,你这个创建动态创建的初始化的数组,这个数组里边默认值是不是都是零。是默认值都是零啊各位。啊。这个默认值是零,跟我们生成随机数零有没有?加个一吧。跟我们这个这个零,这个五个生成五个不重复的随机数。对吧,零到100有可能会生成零,那这个生成的零还是说我们这个数组里边本身就有一个零,这个是不是分不清了。对吧。也算。那你得判断呀,那你是生成的零。还是它里边默认的零啊,你最好不要这么干,你最好给一个默认值都给个给个负一也行。
04:02
I等于零,假如说啊,然后呢,I怎么着呢,小于AR点什么呀?Les I干啥呀?加加你每循环一次的,你给这个数组加标为I的元素,给它负一个负一呗。这样的话,这个数组当中就是相当于所有的元素不都是负一吗?对吧,哎,是这个理吧。创建个random对象,给一个我们的一个数组。对吧,长度是五的一个一位数组。默认值都是零,默认值都是零,默认值都是零。For循环,I等于零,I小于a.Les I加,加。啊,A加加,然后呢,每循环一次呢,从这个数组下标为I的这个位置上附上一个负一。对吧,哎,附上一个负一啊,那相当于说现在实际上等于这个数度是这个德行负一负一。对吧,哎,负一。是不是,哎,负一负一。
05:01
对吧,哎是这样一个情况啊,但是你这样写的太费劲了啊,另外一个我们可以使用一个循环,是不是,哎循环给它每个元素附上一个什么呀,哎叫做负一。给了个默认值啊,负一。这个值呢,正好是怎么着啊,不是我们零到100里面的数字。对吧,循环生成随机数。怎么生成那R呗,Random呗,点什么呀?Next int生成谁101呗,对吧,这样的话是不是生成一个number啊。对不对,哎,那。如果说大家想一想是不是接下来你看看这个逻辑啊,这个就表示生成什么随机数,你再往下的逻辑就是说判断什么呀,这个AR数组中有没有。这个number。就有没有这个。如果有这个number。
06:06
对吧,或者说如果没有吧,应该说如果没有这个number。就放进去。大家想想,如果没有这个number是不是就放进去啊,对吧,就是如果怎么着啊,叫不包含谁不包含A数组中不包含这个number,那你是不是应该把number放进去啊。那放进去,那你应该是AR这个数组下标为I的这个位置给它怎么着啊,哎,不应该是V为啊,就是这应该是有个下标,是不是AR这个数组下标指定一下,把number给它附上去。对吧,那这个下标是几呢。你看我一般啊这个逻辑啊,我在写代码有个习惯就可以,呃,先写出伪代码。先把这个逻辑先写出来,你看啊,先给一个这样的生成随机数的对象,然后给一个啊数组,然后数组中容纳几个元素啊,五个元素默认都是零,然后呢,循环过程当中呢,我们把这个数组中每个元素啊给它初始化成负一。
07:12
啊,然后呢,死循环,你看这先写成死循环是吧,先写成死循环啊,每循环一次生成一个什么呀,数字是不是,哎,如果说怎么着。我们的这个数字在尔尔瑞AR这个数组里面不包含。不包含,我们就把这个number怎么着给了他。但是这块呢,下标怎么搞定呢?首先我觉得可以这样,在Y循环外边,这是一种变成素养了啊,你可以先准备一个什么下标,让默认值是零。对吧,一旦你不包含,那我的可以放进去。啊,可以放进去,这你就写谁呀,Index就行了,但你一定要让index干什么呀,加加明白什么意思吧,就是说你把number呢,放到这个数组当中了,你一定D。
08:00
下边要加一啊,因为下一次再循环过来之后,这一块我们往里边放的时候,肯定要放到第二个位置上,那这个循环结束的条件是什么呀。循环结束条件是什么,各位?这下标最多,最多这个下标等于几啊。等于四吧。是不是,那如果是index要是怎么着小于什么?A,是吧?我们是不是可以去做这件事情?大家想一想,思考一下。是不是index小于a.N啊。因为那代在加在加加呀,你从零。小鱼吧,哎,进来了。零嘛,是不是等于把这个number放进去了。加加一之后变成一了吧。变成一再进来一是不是小于它。
09:00
好,那再进来,那这个是不是就是一了。那这个number是不是就放到一的位置上了,再加加是不是变成二了?对吧,哎,是不是放到二再加加是不是变成三了,再加加是不是变成四了。对吧。加加之后。变成了四。接下来AR4等于什么呀,这number就相当于把那个number放到什么,哎,最后那个位置上了,那么再加变成五了呀,变成五的话,那这个就是五呗,那五的话ar.les是什么?是五吧。五小于五,大家想一想,是不是就放了?False条件一旦成立,是不是Y循环就结束了?对吧,哎,所以说这个还是比较巧妙的啊,这块呢,其实就是ar.les然后这个呢,其实就是index。就是index啊,Index值给个零,然后只要index它小于A点,我们就一循环一直循环,你可以先在这写一个处对吧,你慢慢去推呗,Index如果它小于我们ar.li的情况下,我们就有必要往下变利啊,往下循环生成我们的随机数,对吧,而且你这个加加不能放到我们的这个一服一居外边。
10:10
如果说只有你AR数字里不包含这个number的话,我们才往里边放。那你如果说Y循环每循环一次就加一次,每循环一次加一次,那这个循环最多就是循环五次。对吧,那index加加,如果放到这个if语句条件里边的话,那就相当于有没有可能这个Y循环循环100次啊。有没有可能,同学们有没有可能,这个外循环循环100次有没有可能,有可能。那有可能其中95次都是重复的。都是重复的呀,在这个数组里边已经有了。是吧,我这个index加的前提条件是你这个数组值不包含这个元素,不包含你生成的这个随机数,我就我就加进去对吧,所以这一块呢,也是一个哎,Index index,那你想一想这个代码其实你要这样写的话,先赋值后自加一,先赋值后自加一,那你完全可以不用这样写,对吧?你直接写index加加不就行了吗?调这不就完事了吗?
11:07
对吧,当你你代等于零的时候,那接下来这个你代加加不就是零吗。对吧,这就是零啊。当然,当你这行代码执行结束之后,这个index值肯定变成一了。当你这条代码执行结束之后,到这儿了,这个index它是几啊,是一。这不是等于是先赋值之后在这儿再加一吗?你天天背是怎么背怎么背的,你看先赋值往这儿赋,然后再自加一吗?如果是先赋值后自加一的话。那你就完全可以把加加放到变量后,加加放在变量后,是先做复制运算后做四加一嘛,所以你加加可以放到这里啊。对吧,简写一下呗。那么接下来这个你就可以提提取一个方法出来嘛,说数组中是否包含这个,呃,这个这个这个这个数字number对吧,那你可以写个方法呀。单独在这里提取方法对吧?哎,单独编写一个方法,这个方法专门用来判断啊,数组中是否包含某个元素啊。
12:13
当你没有办法在这写的时候,你就可以提方法,你可以往提取方法单独写个方法,这个方法就是用来判断数组里边是否包含这个元素的,而且你if小括号里边东西只能是true或者是false,你想一想,这个地方的方法的返回值是不是就是返回布尔类型?你的编程感觉就是这样来的,对吧?Public static对不对?返回布尔类型方法名叫contains,包含判断什么呀,这个数组里边是否包含诶我们这个元素。就我们这个数组当中是否包含这个元素,如果这个方法返回处就表示这个数组面包含这个元素,如果这个返回false,就表示这个数组里边不包含这个元素。可以吧,所以你这个时候呢,你就可以在这写上去一个注释啊。
13:01
对吧,就单独编写一个方法,这个方法专门用来干什么呀?判断我们数组当中是否包含某个元素,这个就是那个数组,这个就是哎,那个元素吧,是不是,哎,这是数组,这是元素,然后接下来干什么呀?哎,我们return一个什么呀?True表示什么呀,包含呗,False表示什么呀,不包含。对吧,竖表包含false表不包含,你就可以把这个方法写一写嘛,那现在你数组有了判断这个元素也有了,你数组判断这个元素,你怎么判断呀,我们可以先对数组排序吧,对数组进行升序。行不行啊,可以吧,对数组升序之后,接下来进行什么呀,二分法查找吧。行吧,二分法查找效率快呀,升序排序的话,我们之前讲过,Ara是个工具类,点thought我们就用上来,各位你对谁排序AR?对吧,对我们的A这个数组进行排序,排完序之后你二分法查找,其实就是A点什么呀b research从这个A数组里边去找这个元素啊。
14:08
对吧,找这个元素大家想直接返回什么就行了,找这个元素它的返回值是什么,是不是下标。这个下标有没有可能返回负一?如果没找到就返回负一啊,所以这里有个返回值。是吧,啊,有个返回值返回下标,那如果说我们的index想一想它是大于等于零的,是不是代表存在。如果index是小于零的。各位大家想是不是就不存在呀,所以你这个方法是不是就直接return就行了,Return啥呀,哎,只要它大于等于零,哎,这就写完了这个代码你看。先排序,排完序之后二分法查找。对吧,Ara数组工具类banner是对呃瑞这个数组查找这个K,如果查找的它的下标是大于等于零的,证明什么存在呀。
15:07
你想想是不是这个意思,二分法查找的时候,查找的结果,查找的结果。大于等于零说明这个元素找到了,找到了表示存在啊。对吧,哎,找到了别人的存在啊。那好了,那么这块的话呢,咱们呢,就调一下这个方法呗,Contains,你看如果AR数中不包含不的话是什么意思啊,就叹号呗,加个叹号不包含。不包含对吧?Contains谁呀?A逗号number啊,这样就可以了,你看如果这个数组中不包含叹号是不包含,把它去掉,这是包含啊,什么叫不包含,这叫不包含,明白吧,说你这个数组当中如果不包含我们这个元素,那加进去,那这代码就变成这样了。
16:02
你看。是不是,你看我写这个代码是不是很简练呀,对吧,很简练啊,有点那么个意思对不对?哎,有点那么个意思,有点那么一个像这个呃,散公司源代码靠近的一个意思啊,就判断我们这个数组当中是否包含我们这个元素,对吧?哎,返回处或者是返回false,那你返回处就表示包含呗,返回false表示不包含对吧,那你不包含就是不呗,叹号是不吧,不包含,我们这个数组中不包含这元素,那我就加进去,那这样的话,等我们这个循环结束之后,我们可以变例对吧?变例以上的数组啊,变例以上的数组。我们来看这个数组啊。好了,那么接下来我们可以对它进行for循环。特性I呢等于零,I呢小于它,点什么呀?Lengths I干啥呀?加加输出AR下边为I的元素,我们看看是不是五个不重复的数。
17:00
走一个。呃,他原先都是同学。哎哟,哪的问题各位。那这个结果不对呀。哪的问题?为什么是这样的结果?我知道是咋回事啊,你们知道吗?按说应该生成五个不重复的数啊,怎么负一负一还有呢。什么原因?什么原因,各位?思考一下这个结果为什么是这样的。嗯。思考一下。按说这个结果不应该啊,应该是对的才对。是吧?但是。排序后顺序变了,洪敏说的对啊。是怎么回事啊,就是说我在这儿啊,里边在进行查找的时候,不是二分法查找吗?二分法查找是不是建立在排序的基础之上啊。
18:05
各位。是不是建立在排序的基础之上啊。所以这块呢,它可能啊,在生成的过程当中,因为它默认值都是负一,然后有负一负一负一有五个负一嘛。是不是他一排序的话,负一是不是就到就到前面了。但是这边是不是有可能会index加加呀。Index加加就相当于说什么意思啊,我现在这个程序啊,有一个问题什么问题,就是嗯,我考虑的少了啊。就相当于说。我们这里有一个。两个。三个。四个。对吧,五个,然后这个值是多少?负一是吧,负一负一。负一吧,哎,负一好各位,假如说第一个随机数是28。第一个随数28,它是不是就放进去了各位。
19:00
是不是就放进去了,放进去是不是就变成28了。对吧,哎,但是呢,它还会对这个数组进行排序。对吧,这样的话呢,这个就是负一,这个就变成了28。对吧,这还是负一,这还是负一还是负一排序。然后接下来下一次再生成一个元素的时候,大家还记不记得我生成的这个元素啊,假如说是75。75它由于下标加一了呀,所以75它会放到这个位置上。就导致第一个位置是不是负一了。就理解我说的意思吧,你看这个程序是不是在这儿加进去就加加呀,加加之后这就排序了,那这个问题怎么解决,各位啊,怎么解决。怎么解决这个问题?还不能排序。各位。
20:05
下面直接变利呀。直接便利,效率太低,直接变利吧,只能直接变利各位啊。这种方案有bug啊,逐个检查吧,行吧,听大家的啊,来这这种方案有1.bug啊,这个方案啊。有点bug,有bug啊。呃,有bug bug问题在哪呀?就是说排序排序啊,出问题了,这样吧,直接for循环得了,For行吧,I等于零,I小于a.Les I干啥?加加每循环一次,是不是从这个数组里边去。这个。数组当中。拿出元素吧,对吧,哎,这个数组啊,里边判断它包含不包含这个,如果说我们的。
21:10
A下标为I等于,等于什么?我们的K。恭喜你,Return to,其他情况return一个什么呀,False啊就结束了,不需要不玩啊,不需要立一个flag to false啊,就我们对我们的数组进行循环遍历变历过程当中啊,如果我们这个值啊,和我们后边要查的这个元素啊,它要是相等关系的话,就代表包含呗。条件成立了,条件成立了表示包含呀,返回处吧,如果for循环结束之后,这个还没有执行,执行到这儿的话,就表示不包含呗,对吧,这个就表示不包含,不包含啊。好了,那这样的话进行一个改进,各位啊,刚才这个小bug来咱们执行一下,这就没问题了啊,生成五个元素啊放到诶你看这是五个元素嘛,对吧,七十九七十七十四九十七七来再来一次。
22:11
好,那我们怎么测一下,各位能测出来我们的程序有没有问题,怎么测呀。各位,我们让它生成的这个随机数。不要一到一百一到100范围什么太大了是吧,我们直接咔一下子啊,我们给它整一个六出来,呃,整一个六出来。那就表示能生成的随数值是在哪儿啊。啊。能生成随数是零到五吧,哎,只能生成啊,只能生成零到五的随机数。一共长度是五个,生成零到五的随机数来看一下。
23:00
14532。没充吧。14053没重吧,好各位,我问大家个问题啊,完美吧,来再来一次啊,那它到底循环了多少次呢?那就不一定了。循环多少次就不一定了,你看看啊,生成的随机数是谁呀。来,走一个。啊。生成随数310553052。对吧,但是最后数组里边是不是123455个元素啊,31052。是不是啊,它有重复的。那如果我问大家在这个位置上它生成的随机数,这写的是。四会有什么问题,各位?如果我这个边界值设成四的话,它只能生成什么?只能生成零到几三吧?
24:06
零到三的随机数吧,零到三的随机数永远都凑不够五个吧,是不是永远都有重复的,永远都凑不够五个吧?是不是那凑不够五个这个数组是不是永远放不满,放不满它是不是就死循环。死循环,来,我们看一下。那好吧。对吧,你就一直跑着。一直在生成随机数。对吧,但是不行,为啥呀。停了吧,停了吧。因为你这块呢。生成的随机数怎么着啊,过于少,然后你的数组呢,过于长。那你这个时候就放不满,它就一直循环,这个条件一直成立啊,它一直循环。对吧?哎,所以这块的话,你还可以思考一下你这个程序啊,你这个程序就是说我想通过这个例子告诉大家,就是大家以后要有个习惯,什么习惯就是方法提取的习惯。
25:05
就提取方法的一个习惯,就不要把所有东西都写到main方法里边,写一堆,你可以提取出来。你可以有这种意识啊,像这种题目一开始不建议用便利还是效率真实。福建用力还是效率真是低?呃,怎么说呢?嗯,其实如果说你要用这个的话,效率其实是可以的,因为它这个排序算法用的是堆排序啊,啊或者是其他的排序方式,其实排序还是很快的。啊,排序很快。其实这个效率也可以。因为在排序的过程当中,可能都已经找一遍差不多这个元素啊。二分法确实有点绕是吧。二分法这个东西没啥可绕的啊,这就是方法呗,二维工具类里面的方法,但这个我们这里还不能用啊,因为排序会对原数组导,这个会对原数组产生影响。
26:00
会对原数组产生影响啊,所以我们在这里呢,就。别用了啊,就别用了,我们用正儿800的这种循环就行了啊,循环一个一个取吧,对吧啊,一个一个取啊,取到如果相等的情况下,Return true就行了啊。好了,那这个随机数呢,我们就说到这儿下去之后呢,大家嗯,可以弄一个什么呀,点名对吧,可以自己写一个程序。对吧,点名程序,咱们每个学生不都有学号吗?然后点名就行了啊。
我来说两句