function sel = URandSel(in,n)
% sel = RandSel(in,n)
%   if N is a scalar
%     randomly selects N elements from set IN, each element from IN will
%     be selected up to one time (so sampling without replacing).
%     Output is of size 1xN
%   if N is a vector
%     randomly selects prod(N) elements from set IN, without replacing. N
%     specifies the shape of the output, e.g., if N=[10 10 5], SEL will be
%     a 10x10x5 matrix
%   IN can be of any datatype and can have any number of dimensions and
%   elements

% 2008-08-27 DN Wrote it
% 2012-06-13 DN Can now also return shaped inputs through non-scalar n input

if isscalar(n)
    nElem = n;
    n     = [1,n];
else
    nElem = prod(n);
end

psychassert(nElem<=numel(in),'More return elements requested (prod(n): %d) than number of elements in input (numel(in): %d)',nElem,numel(in));

selind  = NRandPerm(numel(in),nElem);
sel     = reshape(in(selind),n);