我有一个包含{0}和其他8个元素的集合,总共9个元素。我想在这个集合中选择随机3值并创建一个3x1列矩阵。这将重复集合中所有可能的选择。我该怎么办?
答案 0 :(得分:0)
正如@Picket在评论中所说,
RandomSample的工作方式将确保它不会在一次通话中输出两次相同的选择
如果您的列表很小,您可以生成所有子集并对其进行采样。
实施例
RandomSample[Subsets[{a, b, c, d, e, f}, {3}], 7]
将生成具有3个(不同)元素的所有(20个)子集,然后均匀地选择7个不同的(有选项以不同方式对每个成员进行加权,选择随机生成器等)。
RandomSample[Flatten[Permutations /@ Subsets[{a, b, c, d, e, f}, {3}], 1], 13]
将在一组6个元素中生成3个不同元素的所有(120)个可能的有序选择,并给出该列表中13个不同元素的样本。
如果您想要的是所有可能的大小为3的子集的随机排序,或者没有大小为3的所有有序选择的顺序排序,请以相同的方式询问,但是确切地使用这些集合的数量。
myset = { foo, foo2, foo3, foo5 };
RandomSample[Subsets[myset, {3}], Binomial[Length[myset],3 ]]
RandomSample[Flatten[Permutations /@ Subsets[myset, {3}], 1], 3!*Binomial[Length[myset],3 ] ]
(如果您询问的可能性超过确切的数量,则RandomSample会抱怨)
现在,如果您的初始集很大,因此子集的集合对于生成时间和内存来说是不切实际的,那么即使在统一分布方面它不是完美的,也要利用按数字表示集合的组合。假设您的初始集有20个不同的元素。基数20中的三位数字可以表示任何选择3.如果您需要过滤少数一个数字出现多次
20^3/(3!*Binomial[20, 3]) // N
1.16959
通过产生比你需要的数字多25%的数字并重复过滤,你可能是安全的:
Cases[IntegerDigits[RandomSample[0 ;; 20^3-1, Ceiling[31*(1 + 1/4)] ], 20, 3], _?(Length[Union[#]] == 3 &), 1, 31]
这将在基数20中生成39个不同的3位数字的随机样本,并以3坐标向量列表的形式选择前31个没有重复的数据。