# Generating a random sample of elements from a list that includes a subset of the list

Imagine I have a list: tList = {item1,item2,item3,item4,item5,item6,...}, and I'd like to take a random sample of numItems elements of the list: RandomSample[tList,numItems]. Is there a way to specify the random sample should contain some subset of the elements in tList, e.g. {item65,item70,item2,...}? The hope is then that all of the elements from the random sample are returned scrambled, including the order of the elements in the subset?

I did not assume you won't have repeated elements in your base list (that is after all one way to weight sampling).

rsamp[list_, needs_, size_] :=
RandomSample[Join[needs, RandomSample[Fold[DeleteCases[#1, #2, 1, 1] &, list, needs],
Max[0, size - Length@needs]]], size];


This works correctly for weighted base lists:

data = {"a", "w", "l", "a", "w", "l", "a", "w", "l", "a", "b", "c"}
lst1 = {"a", "w", "b"};
rsamp[data, lst1, 5]

(* {b,w,a,w,w} *)


This does not force the "needed" to be in the base, e.g., you can "inject" data into the sample:

rsamp[data, {"R", "A", "S"}, 6]

(* {a,S,R,a,w,A} *)


Obviously, if you want to enforce that the "needed" data is a subset or strict subset, just add the trivial check.