退出以下问题:
我需要生成一个随机集(1 000 000项就够了)
Subsets[Flatten[ParallelTable[{i, j}, {i, 1, 96}, {j, 1, 4}], 1], {4}]
此外,我需要拒绝任何具有非唯一第一元素的四元组,例如{{1,1},{1,2},{2,3},{6,1}}
。
但是在笔记本电脑上面是不可能的。我怎么能统一绘制一百万套,避免杀死我的机器?
答案 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展示了如何做到这一点,并且成本并不高。