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

500*_*500 5 wolfram-mathematica tuples set subset

退出以下问题:

选择案例

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

Subsets[Flatten[ParallelTable[{i, j}, {i, 1, 96}, {j, 1, 4}], 1], {4}]
Run Code Online (Sandbox Code Playgroud)

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

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

Sza*_*lcs 4

假设您有一个基础集,您需要生成 4 元素子集,

baseSet = Flatten[Table[{i, j}, {i, 1, 96}, {j, 1, 4}], 1];
Run Code Online (Sandbox Code Playgroud)

您可以使用RandomSample如下:

RandomSample[baseSet, 4]
Run Code Online (Sandbox Code Playgroud)

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

Timing[subsets = Table[RandomSample[baseSet, 4], {1000000}];]
Run Code Online (Sandbox Code Playgroud)

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

subsets = Union[subsets];
Run Code Online (Sandbox Code Playgroud)

此后,由于可能的子集数量大得多,我在样本运行中仍然剩下 999 971 个项目 ( Binomial[Length[baseSet], 4] == 891 881 376)