# Probability Selector

Craig Lindley is a degreed hardware engineer who, until recently, had been writing large-scale Java applications. Now in retirement, he designs, builds and writes about the projects he wants to. He can be contacted at calhjh@gmail.com.

We programmers usually strive to write deterministic code that has predictable, repeatable behavior. Behavior that is not predictable and repeatable usually indicates a bug that must be found and fixed. Sometimes, however, the introduction of controlled randomness may be exactly what is needed to make our presentations more dynamic or to better test software we have already written.

In my case I was writing a ray tracing application for the iPhone/iPod Touch called Art Rays Lite. This app generates unique, one of a kind, ray-traced images in real time. Initially I used unconstrained randomness to select which geometric shapes (spheres, cones, cylinders, boxes, planes) to use within a scene, where these shapes would be placed in the 3D space, what their surface characteristics were (dull, shiny, reflective, etc.) and what colors would be used for these objects and for the scene light sources.

While the images produced were almost always interesting in some aspect the random selection of colors produced images that were sometimes jarring and not altogether pleasant. Since I actually wanted to sell this app it was important that most of the generated images were interesting and pleasant to look at.

This led me to the concept of using palettes for color selection instead of randomly generating colors. In this context a palette is a collection of 256 related colors. I decided to define numerous palettes because I wanted a lot of variation in the generated images. To this end I came up with the set of palettes in Table 1 for use in my ray tracer.

Table 1: Ray tracer palettes.

I started to formulate the problem as follows: I would like to use the R_GRAYSCALE palette approximately X percent of the time, the R_COLOR palette approximately Y percent of the time, the R_COLOR_FROM_IMAGE palette Z percent of the time and so on. The ProbabilitySelector class was developed to encapsulate this probability selection process.

From its initial use for palette selection within the Art Rays Lite app, ProbabilitySelectors are now being used in three other areas of the code to constrain randomness and hopefully create more pleasing images. ProbabilitySelectors might be useful in your code if you can formulate the problem to be solved like I did above.

Other possible uses might be in picking directories of digital photographs for display in a digital picture frame. You might want to select pictures from a family directory 60% of the time. Pictures from your pets directory 30% of the time. Pictures from your sports car directory 10% of the time.

ProbabilitySelectors might also come in handy for software testing. You might use a ProbabilitySelector for picking suites of tests to run and then use another ProbabilitySelector to pick which tests within a suite to run. Executing test suites and test cases in an unpredictable order might point out bugs in the code you might not have seen otherwise.

### More Insights

 To upload an avatar photo, first complete your Disqus profile. | View the list of supported HTML tags you can use to style comments. | Please read our commenting policy.

# First C Compiler Now on Github

The earliest known C compiler by the legendary Dennis Ritchie has been published on the repository.

# HTML5 Mobile Development: Seven Good Ideas (and Three Bad Ones)

HTML5 Mobile Development: Seven Good Ideas (and Three Bad Ones)

# Building Bare Metal ARM Systems with GNU

All you need to know to get up and running... and programming on ARM

# Amazon's Vogels Challenges IT: Rethink App Dev

Amazon Web Services CTO says promised land of cloud computing requires a new generation of applications that follow different principles.

# How to Select a PaaS Partner

Eventually, the vast majority of Web applications will run on a platform-as-a-service, or PaaS, vendor's infrastructure. To help sort out the options, we sent out a matrix with more than 70 decision points to a variety of PaaS providers.

More "Best of the Web" >>