# Bucket List Randomize

Please take a moment to consider if this thread is worth bumping.

## Recommended Posts

a conversation here

led to a posit. How might we randomly choose a prize from a gumball machine of No-Copy items, so that no two No-Copy prizes of the same kind would be given twice in a row, while also knowing that the No-Copy items in the gumball machine's Contents are named like:

A Item, A Item 1, A Item 2, Another Item, Another Item 1, Lonely Item, Yet Another, Yet Another 1, Yet Another 2, Yet Another 3, etc

a way to do this is with a bucket list shuffle (randomizing) algorithm

this kind of algorithm is one of those obscure things which we hardly ever need or use in the normal course, until we do need it

```list bucketRandomize(list items, integer taglen)
{
// taglen is the min. number of chars needed to tag (uniquely identify)
//   groups of items to go in separate buckets
// taglen must be a positive number in [0..n]

// decrement taglen to be a string position pointer
if (--taglen < 0) taglen = 0;

// prep items
items = llListSort(items, 1, TRUE);
integer len = llGetListLength(items);

// find largest number of same tag. This is the number of buckets
string item;
integer maxc;
integer maxp;
integer c;
integer p;
integer i;
for (i = 0; i < len; i++)
{
string tag = llGetSubString(llList2String(items, i), 0, taglen);
if (tag == item) // increment (c)ount
c++;
else  // new tagged item
{
if (c > maxc)
{
maxc = c; maxp = p;
}
item = tag; c = 1; p = i;
}
}

// move buckets to front
items = llList2List(items, maxp, maxp + maxc - 1) + llDeleteSubList(items, maxp, maxp + maxc - 1);

// fill buckets with remaining items
c = 1; p = i = maxc;
while (i < len)
{
while (p)
{
item = llList2String(items, i);
// shuffle item into the bucket
items = llListInsertList(llDeleteSubList(items, i, i), [item], p - (integer)llFrand((float)(c)));
p -= c; i++;
}
c++; p = i;
}

// shuffle buckets
// note that this uses treble pipe |||. If ||| is in your data then use other chars as pipe
return llParseString2List(llDumpList2String(llListRandomize(items, c), "|||"), ["|||"], []);
}

default
{
state_entry()
{
list items = [
"D", "D1", "D2", "D3", "D4",
"K",
"E", "E1", "E2",
"C", "C1", "C2", "C3",
"B", "B1", "B2", "B3", "B4", "B5",
"H", "H1",
"F", "F1", "F2", "F3", "F4",
"A", "A1", "A2", "A3", "A4", "A5", "A6", "A7"
];

llOwnerSay("*****");
llOwnerSay("items: " + llDumpList2String(items, " "));

items = bucketRandomize(items, 1);

llOwnerSay("bucket: " + llDumpList2String(items, " "));
}
}```

• 1