随机化列表<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />我需要随机化一个列表。
randomizeList = Function({List}, {Default Local},
//代码在这里
返回列表;
);
列表 = {1,2,3,4,5};
随机列表 = 随机列表(列表);
打印(随机列表); //预期的输出类似于 {2,4,5,1,3}
有很多方法可以做到这一点,而且没有错误的答案。我感谢任何反馈,谢谢!
回复:随机化一个列表喜欢直线;列表的 N^2 行为已修复!
回复:随机化一个列表
我增加了列表大小以帮助更好地区分,尽管方法之间的差异并不大。 令人惊讶的是上述结果与这些结果之间的时间差异。 此外,100 行的 pmroz 方法比 10000 行慢,这似乎很奇怪。 也许是因为重复了制作桌子的任务?
JMP 13 测试版 8
Mac 2.5 GHz 英特尔酷睿 i7
16 GB 1600 MHz DDR3
| N 项 | pmroz | 杰夫 | 拜伦 | 菲尔 |
| 100 | 0.1833333333 | 0 | 0 | 0 |
| 1000 | 0 | 0 | 0 | 0 |
| 10000 | 0.0166666667 | 0 | 0 | 0 |
| 50000 | 0.05 | 0.0166666667 | 0 | 0.0166666667 |
| 100000 | 0.1 | 0.0333333333 | 0.0333333333 | 0.0333333333 |
| 500000 | 0.6 | 0.2333333333 | 0.1666666667 | 0.2666666667 |
| 1000000 | 1.3166666667 | 0.5166666667 | 0.3666666667 | 0.5666666667 |
| 10000000 | 17.633333333 | 6.1833333333 | 4.3 | 7.15 |
回复:随机化一个列表下面的代码比较了四种算法。数据存储在表格中,然后绘制图表。我很好奇这在 JMP 13 中是什么样子的?
// pmroz 版本
pmroz_randomizeList =功能({一个列表} , {默认本地} ,
天然橡胶=物品(一个列表) ;
dt =新表( “” ,私人的,添加行(天然橡胶) ,
新列( “数据” ,数字,连续的,格式( “最好的” , 12 ) ,
设定值(一个列表) ) ,
新列( “随机” ,数字,连续的,格式( “最好的” , 12 ) ,
公式(随机制服() ) )
) ;
dt <<种类(更换表,经过( :随机的)) ;
随机列表= dt :数据<<获取值;
) ;
// Jeff Perkinson 2016 年 7 月 13 日下午 2:00(回复 Peter Mroz)
jeff_randomizeList =功能({一个列表} , {默认本地} ,
一个列表[秩( j (物品(一个列表) , 1 ,随机制服()))]
) ;
// 拜伦函数
byron_randomizeList =功能({一个列表} , {默认本地} ,
天然橡胶=物品(一个列表) ;
列表=随机洗牌( 1 ::天然橡胶) ;
泡罩=一个列表[列表[ 1 ::天然橡胶]] ;
) ;
// 菲利普布朗 2016 年 7 月 14 日上午 9:50
phil_randomizeList =功能({一个列表} , {默认本地} ,
一个列表[秩(重复({随机制服()} ,物品(一个列表) ) )]
) ;
列表= { 100 , 1000 , 10000 , 20000 , 30000 , 40000 , 50000 , 70000 } ;
dt =新表( “随机列表” ,添加行(物品(列表) ) ,
新列( “N 项” ,数字,连续的,格式( “最好的” , 12 ) ) ,
新列( “pmroz” ,数字,连续的,格式( “最好的” , 12 ) ) ,
新列( “杰夫” ,数字,连续的,格式( “最好的” , 12 ) ) ,
新列( “拜伦” ,数字,连续的,格式( “最好的” , 12 ) ) ,
新列( “菲尔” ,数字,连续的,格式( “最好的” , 12 ) )
) ;
为了(一世= 1 ,一世<=物品(列表) ,一世++,
纳米=列表[一世] ;
dt : N 项[一世] =纳米;
我的列表= (作为列表( 1 ::纳米))[ 1 ] ;
开始=滴答秒() ;
随机列表= pmroz_randomizeList (我的列表) ;
过去=滴答秒() -开始;
dt : pmroz [一世] =过去;
等待( 0 ) ;
开始=滴答秒() ;
随机列表= jeff_randomizeList (我的列表) ;
过去=滴答秒() -开始;
dt :杰夫[一世] =过去;
等待( 0 ) ;
开始=滴答秒() ;
随机列表= byron_randomizeList (我的列表) ;
过去=滴答秒() -开始;
dt :拜伦[一世] =过去;
等待( 0 ) ;
开始=滴答秒() ;
随机列表= phil_randomizeList (我的列表) ;
过去=滴答秒() -开始;
dt :菲尔[一世] =过去;
等待( 0 ) ;
) ;
dt <<图形生成器(显示控制面板( 0 ) ,
变量( X ( : N 项) ,是( : pmroz ) ,是( :杰夫,位置( 1 ) ) ,是( :拜伦,位置( 1 ) ) ,
是( :菲尔,位置( 1 ) ) ) ,
元素(积分( X ,是( 1 ) ,是( 2 ) ,是( 3 ) ,是( 4 ) ,传奇( 1 ) ,抖动( 1 ) ) ,
更平滑( X ,是( 1 ) ,是( 2 ) ,是( 3 ) ,是( 4 ) ,传奇( 2 ) ) )
) ;
回复:随机化一个列表私有表非常有用,但要小心,因为每个表占用的内存较少;他们更难追踪。您可以通过创建和打开私有表来快速占用大量内存,并且很容易错过,因为它们没有物理窗口(如我上面的示例)。
但是,它们可以为您节省大量时间,因为您不需要关闭它们,您只需重新分配保存它们的变量(这是我上面的意图,但没有意识到您的函数有一个 {Default Local} ——DOH!)。
从脚本指南:
私有数据表
通过包含私有参数从视图中完全隐藏数据表:
dt = Open("$SAMPLE_DATA/Big Class.jmp", "private");
当脚本打开和关闭多个表时,将表设为私有可以防止内存问题
表。私有数据表没有物理窗口,因此需要的内存少于使用
看不见的桌子。
与不可见表一样,在私有数据表上运行的分析会链接到该表。
为避免丢失私有数据表,您必须为其分配一个引用,如前面所示
例子。否则,JMP 会立即从内存中删除私有数据表。
稍后在脚本中对该表的其他使用会产生错误。
回复:随机化一个列表还有一种方式......
// 菲利普布朗 2016 年 7 月 14 日上午 9:50
phil_randomizeList =功能({aList},{默认本地},
一个列表[秩(重复({随机制服()},物品(一个列表) ) )]
);
我不认为这比内置函数 Random Shuffle 更快,但我一直喜欢使用 Repeat({}, n) 为某些应用程序生成列表。
回复:随机化一个列表这私人的关键字很有趣——表格甚至没有出现在窗口列表中。我想它可以节省一些内存。我可以在很多地方使用它。谢谢msharp!
回复:随机化一个列表那么 JMP 13 插入更改将解决相同的问题吗?这是个好消息!
回复:随机化一个列表表函数对于大型数据集非常有效。主要原因之一是 b/c JMP 利用了多核,而 JSL 没有。但是,对于小型数据集,创建表的过程会增加很多开销。对于我使用它的应用程序,我实际上有一些类似于 PMroz 的答案,但由于我的列表都是 <1000 项,我注意到它增加了相当多的时间。
感谢大家!
注意:Today() 只精确到秒,Tick Seconds() 精确到 1/60 秒,HP TIME() 精确到微秒。当然,这一切都取决于您的计算机。另外,为了公平起见,我将您的表更改为私有表,并删除了 close 语句,这将加快您的脚本速度。
名称默认在此处( 1 ) ;
// pmroz 版本
pmroz_randomizeList =功能({一个列表} , {默认本地} ,
dt =新表( “” ,私人的,
新列( “数据” ,设定值(一个列表) ) ,
新列( “随机” ,数字,连续的,公式(随机制服() ) )
) ;
dt <<种类(更换表,经过( :随机的)) ;
随机列表= dt :数据<<获取值;
) ;
// Jeff Perkinson 2016 年 7 月 13 日下午 2:00(回复 Peter Mroz)
jeff_randomizeList =功能({一个列表} , {默认本地} ,
一个列表[秩( j (物品(一个列表) , 1 ,随机制服()))]
) ;
// 拜伦函数
byron_randomizeList =功能({一个列表} , {默认本地} ,
天然橡胶=物品(一个列表) ;
列表=随机洗牌( 1 ::天然橡胶) ;
泡罩=一个列表[列表[ 1 ::天然橡胶]] ;
) ;
纳米= 100 ; // 设置列表元素个数
imax = 100 ; // 设置迭代次数
我的列表= (作为列表( 1 ::纳米))[ 1 ] ;
开始=惠普时间() ;
为了(一世= 1 ,一世<= imax ,一世++,
随机列表= pmroz_randomizeList (我的列表) ;
) ;
过去=惠普时间() -开始;
打印( “pmroz:” ||字符(过去)) ;
等待( 0 ) ;
开始=惠普时间() ;
为了(一世= 1 ,一世<= imax ,一世++,
随机列表= jeff_randomizeList (我的列表) ;
) ;
过去=惠普时间() -开始;
打印( “杰夫:” ||字符(过去)) ;
等待( 0 ) ;
开始=惠普时间() ;
为了(一世= 1 ,一世<= imax ,一世++,
随机列表= byron_randomizeList (我的列表) ;
) ;
过去=惠普时间() -开始;
打印( “拜伦:” ||字符(过去)) ;
等待( 0 ) ;
//输出
“pmroz:121646”
“杰夫:3990”
“拜伦:3488”
回复:随机化一个列表结果将在 JMP 13 中发生变化。
快速列表
JMP 13 中的 400,000 看起来像这样:
“pmroz:0.533333333332848”
“杰夫:0.233333333333576”
“拜伦:0.216666666667152”
回复:随机化一个列表很有意思。我的表格解决方案似乎有点暴力,但当列表元素的数量超过 15,000 个时,它的性能优于其他两个函数。表函数显然非常有效。

这是我使用的代码:
// pmroz 版本
pmroz_randomizeList =功能({一个列表} , {默认本地} ,
天然橡胶=物品(一个列表) ;
dt =新表( “” ,无形的,添加行(天然橡胶) ,
新列( “数据” ,数字,连续的,格式( “最好的” , 12 ) ,
设定值(一个列表) ) ,
新列( “随机” ,数字,连续的,格式( “最好的” , 12 ) ,
公式(随机制服() ) )
) ;
dt <<种类(更换表,经过( :随机的)) ;
随机列表= dt :数据<<获取值;
关( dt ,节省) ;
随机列表;
) ;
// Jeff Perkinson 2016 年 7 月 13 日下午 2:00(回复 Peter Mroz)
jeff_randomizeList =功能({一个列表} , {默认本地} ,
一个列表[秩( j (物品(一个列表) , 1 ,随机制服()))]
) ;
// 拜伦函数
byron_randomizeList =功能({一个列表} , {默认本地} ,
天然橡胶=物品(一个列表) ;
列表=随机洗牌( 1 ::天然橡胶) ;
泡罩=一个列表[列表[ 1 ::天然橡胶]] ;
) ;
纳米= 4000 ; // 设置列表元素个数
我的列表= (作为列表( 1 ::纳米))[ 1 ] ;
开始=今天() ;
随机列表= pmroz_randomizeList (我的列表) ;
过去=今天() -开始;
打印( “pmroz:” ||字符(过去)) ;
等待( 0 ) ;
我的列表= (作为列表( 1 ::纳米))[ 1 ] ;
开始=今天() ;
随机列表= jeff_randomizeList (我的列表) ;
过去=今天() -开始;
打印( “杰夫:” ||字符(过去)) ;
等待( 0 ) ;
我的列表= (作为列表( 1 ::纳米))[ 1 ] ;
开始=今天() ;
随机列表= byron_randomizeList (我的列表) ;
过去=今天() -开始;
打印( “拜伦:” ||字符(过去)) ;
等待( 0 ) ;
回复:随机化一个列表在 JMP 中,几乎总是至少有三种方法可以做任何事情。所以这里是第三个。
从 alist 开始,制作一个随机数字列表,等于 alist 中的项目数。 然后按照 rslist 的顺序用 alist 的值制作 blist。
alist={a,b,c, 1 , 2 , 3 };
rslist=随机洗牌( 1 ::物品(一个列表));
blist=alist[rslist[ 1 ::物品(一个列表)]];
如果您在列表中使用数字或字符或组合,则无关紧要。
我很确定我从 JSL 配套书中得到了这个想法
-拜伦
回复:随机化一个列表这是我的实现。
randomizeList =Function({List},{Default Local}, //Code goes here List[rank(j(nitems(List), 1, random uniform()))]);list = {100,200,300,400,500};randomList = randomizeList(list);print(randomList);如果不清楚我在这里做什么
- 这j()函数创建一个随机数矩阵,例如[0.04757597646676, 0.738883488578722, 0.935981905087828, 0.0233044682536274, 0.493906983872876]
- 这秩()函数返回一个矩阵(例如上面的: [4, 1, 5, 2, 3] ) 用于按随机数排序的顺序返回原始列表。
-杰夫
回复:随机化一个列表这是一种方法。希望看到其他方法!
随机列表=功能({列表} , {默认本地} ,
天然橡胶=物品(列表) ;
dt =新表( “” ,无形的,添加行(天然橡胶) ,
新列( “数据” ,数字,连续的,格式( “最好的” , 12 ) ,
设定值(列表) ) ,
新列( “随机” ,数字,连续的,格式( “最好的” , 12 ) ,
公式(随机制服() ) )
) ;
dt <<种类(更换表,经过( :随机的)) ;
随机列表= dt :数据<<获取值;
关( dt ,节省) ;
随机列表;
) ;
列表= { 1 , 2 , 3 , 4 , 5 } ;
随机列表=随机列表(列表) ;
打印(随机列表) ; //预期的输出类似于 {2,4,5,1,3}