i found it to be written well, it covered everything in a ez to follow manner and you got your goals accross... on the negitive
whatever size font your using for your code PLEASE change it ... it was difficult to read on my 1280x1024 lcd, and impossible on my 1024x768 crt monitor
as far as the code itself...
for (i = 0; i < NotecardLines; i++)
for loops are quite abit slower than do/while loops, not evil but slower
i++ is a post incermental operation
which means it keeps track of what i was and what i will be...
++i just adds one, which is less work
Randomizer = llDeleteSubList(Randomizer, 0, 0);
removing data from list is an intensive process, your reading the entire list,
finding element x, and rebiulding the whole list, why not just point to the next element in the list ?
ok thats about all i see, so ill stop nitpicking your code

id like to see more articles about scripting, it would help to give ppl reasons and theory rather than the usuall break/fix here on the forums
ps heres my version, it does the same thing, but its quicker and less intense on the sim
string NOTECARD_NAME = "data rom";
integer TOTAL_LINES;
integer CURRENT_PLACE;
list DATA;
make_random(){DATA = llListRandomize(DATA, 1);}
default
{
state_entry()
{
llGetNumberOfNotecardLines(NOTECARD_NAME);
}
dataserver(key req_id, string result)
{
if (DATA == [])
{
TOTAL_LINES = ((integer) result - 1);
do
{
DATA += CURRENT_PLACE;
++CURRENT_PLACE;
}
while (CURRENT_PLACE <= TOTAL_LINES);
CURRENT_PLACE = 0;
make_random();
}
else
{
llOwnerSay(result);
if (CURRENT_PLACE < TOTAL_LINES)
{
++CURRENT_PLACE;
}
else
{
CURRENT_PLACE = 0;
make_random();
}
}
}
touch_start(integer na)
{
integer LINE = llList2Integer(DATA, CURRENT_PLACE);
llGetNotecardLine(NOTECARD_NAME, LINE);
}
}