The method I use is pretty similar, generating a random number based
on the sum of the weights, then subtracting the weights from it in
order until I hit (or go below) 0 which means the current weighted
item should be selected.
Although I suppose you could use what Dave said with multiple list
items, especially if you are just keeping track of integers, as they
are easily duplicated without losing much memory.
Cheers
Evan
On Feb 2, 2010, at 2:17 PM, Dave Griffiths wrote:
Hi Kassen,
Without weights:
(define (choose l)
(list-ref l (random (length l))))
(define funcs
(list
(lambda () (display "one"))
(lambda () (display "two"))
(lambda () (display "three"))
(lambda () (display "four"))
(lambda () (display "five"))))
((choose funcs))
I generally do weighting by duplicating list elements, but there
must be
a better way?
cheers,
dave
On Tue, 2010-02-02 at 15:08 +0100, Kassen wrote:
Dear list,
Another -probably simple- Scheme question. Suppose we wanted to
execute one (and only one) of a few functions, pick this one randomly
and assign weights to them. For example we might like to populate a
world with mostly cubes, some spheres and just a few cylinders. How
would we go about this cleanly? I could nest a train of "if"
statements that would compare a (rndf) to a constant but that's
hardly
convenient and leads to ugly code. I could also set up a few (cond)
statements to use with a single random number but since we are
basically dealing with picking from a list I could imagine Scheme,
which is specialised in lists, would have some specialised trick up
it's sleeve that might serve?
Yours,
Kas.