Android下产生随机数的方法的选择

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ZuoZuoShengHen/article/details/49513069

首先界面上放一个TextView控件,一个Button按钮,要实现点击按钮,改变文本控件的文字的颜色。其实实现起来并不难,而且是特别简单的那种,但是我遇到了一些问题,经过和同学与老师的一番讨论,总结了一下产生随机数的方法的使用。

我们完成初始化界面和对Button设置点击事件doClick后,在方法里这样写:

Random random = new Random();
int red = random.nextInt(256);
int green = random.nextInt(256);
int blue = random.nextInt(256);
tv1.setTextColor(Color.rgb(red, green, blue));
 
 

楼主认为这种是写得还不错的一种,但是我为了偷懒,并没有定义red,greed,blue变量,而是在Color.rgb()方法里直接new出了三个Random对象作为参数。

      

tv1.setTextColor(Color.rgb(new Random().nextInt(256),new Random().nextInt(256), new Random().nextInt(256)));

这看上去好像也没什么不同的,但实际运行后我就发现了大有不同!!!
第一种点击按钮颜色变换十分的均匀,颜色变化明显,但是第二种变换时而明显,时而不明显,这是到底是怎么回事呢?
我刚开始以为是我产生随机数的方法不对,我又使用了另一种方法产生随机数,
于是我尝试了另一种写法:
   tv1.setTextColor(Color.rgb((int) (Math.random() * 256),(int)( Math.random() * 256), (int) (Math.random() * 256)));
我发现这种写法与只用一个Random对象一样,颜色变化十分的均匀。于是我比较了一下两种产生随机数的方法:我发现Math.random()里面也是调用的Random的构造方法,而且Random产生随机数是根据系统当前的时间加上一个HashCode的值作为生产种子,切生产种子是使用synchronized修饰的,但不同的是Math.random()方法使用了同步synchronized修饰,说明此方法时线程安全的,而Random则没有,所以在调用Color.rgb()方法时,第一种方法产生的三个线程会互相的干扰,而第二种则不会,但是第二种会较为消耗系统资源,所以我们根据不同的情况来使用Random和Math.random两种产生随机数的方法,若想使颜色变化均匀,如果有多个线程同时产生随机数,使用第二种Math.random()更安全,代价是会影响可扩展性,若只有单个线程想产生随机数,也就是只用一个对象产生随机数时,推荐使用Random。

猜你喜欢

转载自blog.csdn.net/ZuoZuoShengHen/article/details/49513069