隨機化列表<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}