in reply to Re: Don't-Repeat-Myself code for improvement
in thread Don't-Repeat-Myself code for improvement

If item "foo" gets written as the first item in the file at iteration $N and then as the last item in the file at iteration $N+1, then "foo" will be returned twice in a row, which violates 'If I chose "foo" recently, I shouldn't use it again.'

My method of doing this is to permute the list and store it (probably in a database). When I need a new item, I pick a random number ($R) between 0 and $N where $N is a fraction of the size of the list and pick the $R'th least recently used item and mark it as the most recently used item.

One way to record which was most recently used is to put a timestamp in the records in the DB. Then picking the $R'th least recently used item can be done with a simple SQL query using "ORDER BY lastused LIMIT $R,1" (or the equivalent supported by your particular DB) and marking that item "most recently used" is a simple update to the timestamp.

The initial permutation of the list can be done by assigning each timestamp to a random time of day "yesterday".

- tye        

  • Comment on Re^2: Don't-Repeat-Myself code for improvement (foo foo)

Replies are listed 'Best First'.
Re^3: Don't-Repeat-Myself code for improvement (foo foo)
by BrowserUk (Patriarch) on Feb 28, 2007 at 00:16 UTC

    That's a good point, and an interesting solution provided that the number of IDs is small, but horribly expensive if the number of Ids is much more than the 8 shown.

    40 thousand entries for the 8 IDs shown is managable, but if the number rises to 15 then wouldn't you need something like 70 terabytes to store the permutations?


    Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
    "Science is about questioning the status quo. Questioning authority".
    In the absence of evidence, opinion is indistinguishable from prejudice.

      No. My solution uses one DB record per ID. I don't try to store in a DB all possible permutations. I just put one record per item in the DB and "permute" their initial order, such as by setting the "lastused" field for each record to be some random time of day "yesterday", as I mentioned.

      - tye