Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wolfram mathematica 如何从mathematica中的列表中选择一致随机且唯一的元素_Wolfram Mathematica - Fatal编程技术网

Wolfram mathematica 如何从mathematica中的列表中选择一致随机且唯一的元素

Wolfram mathematica 如何从mathematica中的列表中选择一致随机且唯一的元素,wolfram-mathematica,Wolfram Mathematica,我刚才有个问题。只是想知道什么是最好的方式(效率和优雅)来做到这一点。我能想到的方法是使用随机排列对列表的索引进行随机排列,然后从列表中选择第一个m(当然需要小于列表的长度)元素。但这需要Combinatica包 还有更好的选择吗 谢谢。哦。事实证明(从第6版开始),Mathematica只会为您做这件事:正如Jefromi所说,对于MMA6和更高版本,RandomSample就可以了。对于低于6的版本,您可以使用Combinatica软件包中的RandomPermutation函数(这与MMA

我刚才有个问题。只是想知道什么是最好的方式(效率和优雅)来做到这一点。我能想到的方法是使用
随机排列
对列表的索引进行随机排列,然后从列表中选择第一个
m
(当然需要小于列表的长度)元素。但这需要
Combinatica

还有更好的选择吗


谢谢。

哦。事实证明(从第6版开始),Mathematica只会为您做这件事:

正如Jefromi所说,对于MMA6和更高版本,RandomSample就可以了。对于低于6的版本,您可以使用Combinatica软件包中的
RandomPermutation
函数(这与MMA8函数
RandomPermutation
有很大不同):


好吧,虽然它是内置的,但这是如何实现Jefromi建议的:

ClearAll@getel;
getel[{els_, lst_}] := Module[
{pos = RandomInteger[{1, Length@lst}]},
{els~Join~{lst\[LeftDoubleBracket]pos\[RightDoubleBracket]}, 
  Delete[lst, pos]}]

ClearAll@getN;
getN[lst_, n_] := First@Nest[getel, {{}, lst}, n]
用法:
getN[Range[10000],3000]
。只比内置函数慢4个数量级…

这个怎么样

s={{{3, 1}}, {{3, 2}}, {{4, 2}}, {{5, 1}}, {{5, 2}}}

i = 1;
j = 1;
rand[list_] := Drop[
list,
Flatten[
Position[list,   var[i++] = {Flatten[RandomSample[list, 1]]}     ]]
]

Table[var[j++], {Length[s]}]
这会产生
s
的随机排列,没有重复:

{{{5, 2}}, {{3, 1}}, {{5, 1}}, {{4, 2}}, {{3, 2}}}

显而易见的算法是在选择元素时删除它们。非常容易递归实现,但我已经很长时间没有访问mathematica了,因此我不敢尝试为您实现它。或者您可以使用
RandomSample@s
;-)是的,我同意。RandomSample[l,m]是一个更好的解决方案。
{{{5, 2}}, {{3, 1}}, {{5, 1}}, {{4, 2}}, {{3, 2}}}