[java] Random colors?

Started by
5 comments, last by BartG 22 years, 5 months ago
I was wondering how I can create random color values for text, the only way I know how to set Text color in Java right now is c.setTextColor(Color.blue); or whatever, any help on how to create RGB values and store them as colors?
Advertisement
  int red   = (int)Math.floor(Math.random() * 255);int green = (int)Math.floor(Math.random() * 255);int blue  = (int)Math.floor(Math.random() * 255);Color randomColor = new Color(red, green, blue);  


"So crucify the ego, before it''s far too late. To leave behind this place so negative and blind and cynical, and you will come to find that we are all one mind. Capable of all that''s imagined and all conceivable."
- Tool

"There is no reason good should not triumph at least as often as evil. The triumph of anything is a matter of organization. If there are such things as angels, I hope that they're organized along the lines of the mafia." -Kurt Vonnegut
Hmm... That''s a little off. You should be multiplying by 256, not 255.

But it''s also excessively complicated...
  java.util.Random r = new java.util.Random();Color randomColor = new Color(r.nextInt(256), r.nextInt(256), r.nextInt(256);  

No, actually... it is by 255. It returns a number 0.0 - 1.0... so if you multiply by 256, you can get an integer value of 256. Colors range from 0 -> 255... so by multiplying by 255, you will get a correct value.

Billy
Ok, c_wraith, you got me on the 255/256 issue. Sorry AP, but he''s right, Math.random() returns >= 0.0 && < 1.0.

However, I use the Math.random() functions not because they''re visually cleaner, but programmaticly cleaner.
If you''re writing a game and every time you need a random number (which can be fairly often depending on the game) you create a new Random object, you''re incurring an unnessicary object creation, as well as giving more work to the garbage collector. You could use a static Random instance to avoid this, but then you''ve just effectivly duplicated what Math.random() does for you.
Also, if the int you pass in to Random.nextInt() is not a power of 2 it can be signifigantly slower than Math.random().

"So crucify the ego, before it''s far too late. To leave behind this place so negative and blind and cynical, and you will come to find that we are all one mind. Capable of all that''s imagined and all conceivable."
- Tool

"There is no reason good should not triumph at least as often as evil. The triumph of anything is a matter of organization. If there are such things as angels, I hope that they're organized along the lines of the mafia." -Kurt Vonnegut
Well, yes, the java.util.Random should only be created once (per thread, anyway). However, I''d say it''s better than using Math.random(), for two reasons.

First off, if you create one per thread, you can get away without the synchronization Math.random() does. There''s one speed increase, and potentially a big one if you have several threads calling Math.random() simultaneously. Also, calling nextInt(int) may be slower than the call to nextDouble() that Math.random() makes, but there is one less level of indirection, and it doesn''t require floating point arithmetic and integer<->fp conversions. In other words, I''m not convinced Math.random() is any faster when looking for an integer result.

Second, nextInt(256) is more readable than the equivalent Math.random() based expression.
Ok, I did some testing... Calling nextInt (even with a non-power of two argument) takes about half as long as calling Math.random() and converting it.

In other words, I stand by my recommendation of calling nextInt, as long as only one Random is created per thread.

This topic is closed to new replies.

Advertisement