I've often wondered why so many forum questions relate to poker games. It turns out that an example of how to use the List interface is shuffling cards and dealing a hand or hands from the deck. This is not only pleasingly clever, but it is also exactly the kind of operation I am trying to mimic. I am not shuffling and dealing cards but I am wanting to shuffle and deal from a collection of test items.
I am a bit embarrassed to admit that I am planning to use hard coded arrays to generate test items. The thing I boasted most about my school math software when I first produced it was that it used algorithms to generate test items rather that selecting from a finite list.
There are two problems with algorithms. One is the issue of repetition. The second is that of designing an algorithm to generate a precise level of difficulty.
When I was doing my research I collected a lot of data on which math questions children find easy. I even used Rasch methodology to quantify how easy they found them. What surprised me that the rules I had applied when I was writing my algorithms, to generate questions I expected to have various levels of difficulty, did not map reliably with those revealed by the results.
My current strategy is to rank the items generated by algorithms in my research according to their revealed level of difficulty, load them into collections, representing different levels of difficulty, and then use the methods of the List interface to generate sublists or arrays for use on the day.