高效和有条件的元组或子集

时间:2011-10-26 13:29:53

标签: wolfram-mathematica set tuples subset

退出以下问题:

Selecting with Cases

我需要生成一个随机集(1 000 000项就够了)

Subsets[Flatten[ParallelTable[{i, j}, {i, 1, 96}, {j, 1, 4}], 1], {4}]

此外,我需要拒绝任何具有非唯一第一元素的四元组,例如{{1,1},{1,2},{2,3},{6,1}}

但是在笔记本电脑上面是不可能的。我怎么能统一绘制一百万套,避免杀死我的机器?

3 个答案:

答案 0 :(得分:4)

如果您有基本集,则需要生成

的4元素子集
baseSet = Flatten[Table[{i, j}, {i, 1, 96}, {j, 1, 4}], 1];

您可以使用RandomSample,如下所示:

RandomSample[baseSet, 4]

这为您提供baseSet的长度为4的随机子集。在我的旧机器上生成一百万个它们需要2.5秒:

Timing[subsets = Table[RandomSample[baseSet, 4], {1000000}];]

并非所有我们得到的都是不同的子集,因此我们需要使用Union删除重复项:

subsets = Union[subsets];

在此之后,我仍然在样本运行中留下999 971个项目,这要归功于更多可能的子集(Binomial[Length[baseSet], 4] == 891 881 376

答案 1 :(得分:3)

这也应该可以解决问题,它的运行速度比Szabolcs的建议要快。

(t=Table[{RandomInteger[{1, 96}], RandomInteger[{1, 4}]}, {10^6}, {4}]); //Timing

我认为没有必要删除重复的子集,因为我们正在采样,而不是尝试生成整个群体。 (但如果您愿意,可以轻松删除重复项。)

顺便说一句,在这种情况下,Table的运行速度比ParallelTable快。

答案 2 :(得分:1)

我相信David的方法略有不同会产生原始帖子中要求的无重复形式。

set = 
  With[{r = Range@96},
    {RandomSample[r, 4], RandomInteger[{1, 4}, 4]}\[Transpose] ~Table~ {1*^6}
  ];

这当然不会产生10 ^ 6个独特的样本,但Szabolcs展示了如何做到这一点,并且成本并不高。