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

Select 在mathematica中选择集合中的随机值,select,random,wolfram-mathematica,Select,Random,Wolfram Mathematica,我有一个集合,它有{0}和其他8个元素,总共9个元素。我想在这个集合中随机选择3个值,并创建一个3x1列矩阵。这将重复集合中所有可能的选择。我该怎么办?正如@Picket在评论中所说 RandomSample的工作方式将确保它不会在一次调用中两次输出相同的选项 如果列表很小,则可以生成所有子集并对其进行采样 范例 RandomSample[Subsets[{a, b, c, d, e, f}, {3}], 7] 将生成包含3个不同元素的所有20个子集,然后选择7个不同的统一元素。有选项可以对每

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

正如@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个不重复的数字。

RandomChoice可以做您想做的事情。好的,Pickett,但我们选择的一种情况只会出现一次。例如,集合是{1,2,3,4,5,6,7,8,0}。我们选择{1,2,3}。因此{1,2,3}使用了这种情况,这种情况不能出现两次。我们能这样做吗?我以前是说样品。不管怎样,你的目标是什么?如果你有足够的内存并且列表不是太大,你可以使用排列和随机抽样的组合。