Sorry. I was back to work on Monday, and I haven't mentally recovered yet...

Since the objects are static, you just need to create a list attribute somewhere that lists them. You can either use an object list (which directly references the objects), or you can use a string list that contains the names of the objects. The latter requires you to use GetObject to get the actual object from the name. The only advantage to the string list is that you can create and edit it in the Quest editor. The editor doesn't know how to deal with object list attributes.
I decided to punt and not use a static list but rather generate the list by which objects were in a source room. Some code to examine is follows. Note that I have Quest 5.5 installed, so if you have 5.4, you'll have to change the asl version or dump the code into your own game.
<!--Saved by Quest 5.5.5101.21548-->
<asl version="550">
<include ref="English.aslx" />
<include ref="Core.aslx" />
<game name="objlist_text">
<gameid>cd9e7a8a-fb1a-4bb3-8c90-cc19b37793aa</gameid>
<version>1.0</version>
<firstpublished>2014</firstpublished>
<objects type="objectlist"></objects>
</game>
<object name="room">
<inherit name="editor_room" />
<beforeenter type="script">
MoveRandomObjects (limbo, this, 3)
</beforeenter>
<object name="player">
<inherit name="editor_object" />
<inherit name="editor_player" />
</object>
<exit alias="south" to="otherroom">
<inherit name="southdirection" />
</exit>
</object>
<object name="limbo">
<inherit name="editor_room" />
<object name="apple">
<inherit name="editor_object" />
<take />
</object>
<object name="banana">
<inherit name="editor_object" />
<take />
</object>
<object name="monkey">
<inherit name="editor_object" />
<take />
</object>
<object name="drum">
<inherit name="editor_object" />
<take />
</object>
<object name="stick">
<inherit name="editor_object" />
<take />
</object>
<object name="doll">
<inherit name="editor_object" />
<take />
</object>
</object>
<object name="otherroom">
<inherit name="editor_room" />
<exit alias="north" to="room">
<inherit name="northdirection" />
</exit>
</object>
<function name="MoveRandomObjects" parameters="source, destination, count">
if (not HasAttribute(source, "objects")) {
set (source, "objects", GetDirectChildren(source))
}
objects = GetAttribute(source, "objects")
foreach (object, objects) {
object.parent = source
}
set (source, "tempobjects", objects)
tempobjects = GetAttribute(source, "tempobjects")
for (i, 1, count) {
index = GetRandomInt(0, ListCount(tempobjects)-1)
object = ListItem(tempobjects, index)
list remove (tempobjects, object)
object.parent = destination
}
</function>
</asl>
The basic idea behind this is that there is a room that holds the objects you want. I called it "limbo" in the example. Then there is a function called MoveRandomObjects that moves the specified number of objects from the source room to the target room. In order to know what the objects are, the function assumes that the first time it's called, the objects are all in the source room. It captures that list for later use. It also resets all the objects back into the source room before selection. You can see this if you go south in the example and then back north again. Every time you enter the room, a new selection of objects will be there. If you had any of the objects in your possession, they will be moved back to limbo and selected a new.
This may be more complicated than you wanted. In order to pick "n" objects, I had to create a temporary list to pluck objects from. I use that fact that when you assign a list to an object attribute, it copies the list. So when I set the "tempobjects" attribute from "objects", it makes a copy of objects we can remove objects from.
I couldn't put comments in the source that would stick, so it's a bit "self documenting". If you have any questions about how any of it works, I'll be happy to explain.
Hope that gets you at least part way on your way! (And sorry again for the delay getting back to you.)