在mathematica中选择集合中的随机值

时间:2015-02-26 11:18:27

标签: select random wolfram-mathematica

我有一个包含{0}和其他8个元素的集合,总共9个元素。我想在这个集合中选择随机3值并创建一个3x1列矩阵。这将重复集合中所有可能的选择。我该怎么办?

1 个答案:

答案 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个没有重复的数据。