Random Candy Colors
If you saw my recent “Candy Cosmos” post, you may have noticed that the randomly generated colors tend to be rather “vibrant”.
![]()
Pure red, green, blue, cyan, magenta and yellow colors appear frequently, while pure black and white colors occur occasionally, and colors near 50% gray tend to be the least common. The bright candy colors are a side effect caused by “limiting” the random values generated for each color channel.
Let’s say we start off with a neutral gray color with (R, G, B) values of (100, 100, 100). To get our next color we generate a random number between 5 and 10 then we either add it to, or subtract it from, the red channel. That means that there is a 50% chance our new red channel value will be between 90 and 95 and a 50% chance that it will be between 105 and 110. We repeat this process for each of the three color channels then combine them to make our new color. This produces a color similar to our original color, yet noticeably different.
The method above works well until the values of the color channels approach 0 or 255. Suppose the red channel has a value of 0. Using the above randomization technique would generate potential values between (-10 and -5) or between (5 and 10). Color channels can’t hold values below 0 or above 255 so corrective actions need to be taken. A simple solution is to “limit” the values. If the number is below 0 it is set to 0. If the number is above 255 it is set to 255. That means that once a color channel reaches a value of 0 or 255 there is a 50% chance that the value will remain unchanged. This is because there is a 50% chance that the next random number will either be added to, or subtracted from, the original channel value and thus produce a value outside the acceptable range which in turn results in no change to the original value.
Since the color channel values tend to hover near 0 (0x00) and 255 (0xFF), pure CMY colors (0xFFFF00, 0xFF00FF, 0x00FFFF) or pure RGB colors (0xFF0000, 0x00FF00, 0x0000FF) are common. Here is some code to illustrate:
//
// Create an object to contain our 3 color channels (r, g, b).
var myColorObj = {};
//
//
// Create the RGB channels and assign values to each of them.
myColorObj.r = 100;
myColorObj.g = 100;
myColorObj.b = 100;
//
//
// Each color channel will be randomized.
// The color channel will go up or down by at least the MIN value.
var minColorChannelVary = 5;
// The color channel will go up or down no more than the MAX value.
var maxColorChannelVary = 10;
//
//
// Goes through each color channel in a color object
// and adds or subtracts a random number
// between the min and max values
// to each color channel.
// Color channel values are limited between 0 and 255.
function randomizeColor(colorObj, min, max){
for(var i in colorObj){
var chnl = colorObj[i];
var ran = min + Math.random() * (max-min);
chnl += (Math.round(Math.random()) ? ran : -ran);
colorObj[i] = Math.max(0, Math.min(chnl, 255))
}
return colorObj;
}
//
//
// Converts 3 color channels in the color object to
// one hexadecimal value like 0xFFFFFF.
function rgbToHex (colorObj){
return(colorObj.r<<16 | colorObj.g<<8 | colorObj.b);
}
//
//
// Draws a 1 by 100 box using the specified color.
function drawBox(x, color){
//clear();
beginFill(color);
moveTo(x, 0);
lineTo(x+1, 0);
lineTo(x+1, 100);
lineTo(x, 100);
lineTo(x, 0);
}
//
//
// Draw a random color and then move over to the right 1 pixel
// and draw the next random color. Repeat 500 times until
// a brightly colored banded gradient covers the stage.
function genCandyGradient(){
clear();
for(var i=0; i<500; i++){
randomizeColor(myColorObj, minColorChannelVary, maxColorChannelVary);
drawBox(i, rgbToHex (myColorObj));
}
}
genCandyGradient();
//
//
// Draw a new gradient every time the mouse is pressed.
onMouseDown = genCandyGradient;
//
//
//
Here is the SWF produced by the above code, click it to see new random colors:
I doubt you'll need to create a brightly colored banded gradient every day but it may prove useful some time.
So now you know.
RSS Feeds
@Robert, decrease 255 to a lower number.
hi. awesome code! i was wondering if there is any possible way for darker colours?
Kind of an optical illusion they give, don’t they? If I look for a few seconds on the colors I get the imagination that they are moving.
Love the colours. Made a much simpler version a while back for myself, as inspired by a recent trip to Mexico. If there’s anywhere in the world that is reflected in those colours, it’s there.
Love ya work, highly inspiring.