リストをランダム化する<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />リストをランダム化する必要があります。
randomizeList = Function({List}、{Default Local}、
//コードはここにあります
リストを返す;
);
リスト={1,2,3,4,5};
randomList = randomizeList(list);
print(randomList); //{2,4,5,1,3}のような期待される出力
これを行う方法はたくさんあり、間違った答えはありません。フィードバックをいただければ幸いです。ありがとうございます。
Re:リストをランダム化する直線が大好きです。リストのN^2の動作が修正されました!
Re:リストをランダム化する
方法間の違いはそれほど大きくはありませんが、少し区別しやすくするためにリストのサイズを大きくしました。 驚くべきことは、上記の結果とこれらの結果の時間差です。 また、pmrozのメソッドが10000よりも100行の方が遅いのは奇妙に思えます。 たぶんそれはテーブルを作るという仕事を繰り返すことによるのでしょうか?
JMP13ベータ8
Mac 2.5 GHz Intel Core 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.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 |
Re:リストをランダム化する以下のコードは、4つのアルゴリズムを比較しています。データはテーブルに保存されてからグラフ化されます。これがJMP13でどのように見えるのか知りたいですか?
//pmrozバージョン
pmroz_randomizeList =関数({リスト} 、 {{デフォルトのローカル} 、
nr = nitems ((リスト)。 ;
dt =新しいテーブル(( "" 、プライベート、行を追加(( nr )。 、
新しい列(( "データ" 、数値、連続、フォーマット(( "一番" 、 12 )。 、
設定値((リスト)。 )。 、
新しい列(( 「ランダム化」 、数値、連続、フォーマット(( "一番" 、 12 )。 、
方式((ランダムユニフォーム() )。 )。
)。 ;
dt <<選別((テーブルを交換してください、に(( :ランダム化)) ;
random_list = dt :データ<<値を取得する;
)。 ;
// Jeff Perkinson2016年7月13日14:00(Peter Mrozへの返信)
jeff_randomizeList =関数({リスト} 、 {{デフォルトのローカル} 、
リスト[ランク(( j (( nitems ((リスト)。 、 1 、ランダムなユニフォーム()))]
)。 ;
//バイロンの関数
byron_randomizeList =関数({リスト} 、 {{デフォルトのローカル} 、
nr = nitems ((リスト)。 ;
rslist =ランダムシャッフル(( 1 ::: nr )。 ;
blist =リスト[ rslist [ 1 ::: nr ]] ;
)。 ;
//フィリップブラウン2016年7月14日9:50AM
phil_randomizeList =関数({リスト} 、 {{デフォルトのローカル} 、
リスト[ランク((繰り返す({ランダムなユニフォーム()} 、 nitems ((リスト)。 )。 )]
)。 ;
nlist = {{ 100 、 1000 、 10000 、 20000 、 30000 、 40000 、 50000 、 70000 } ;
dt =新しいテーブル(( 「ランダム化リスト」 、行を追加(( nitems (( nlist )。 )。 、
新しい列(( 「Nアイテム」 、数値、連続、フォーマット(( "一番" 、 12 )。 )。 、
新しい列(( 「pmroz」 、数値、連続、フォーマット(( "一番" 、 12 )。 )。 、
新しい列(( 「ジェフ」 、数値、連続、フォーマット(( "一番" 、 12 )。 )。 、
新しい列(( 「バイロン」 、数値、連続、フォーマット(( "一番" 、 12 )。 )。 、
新しい列(( 「フィル」 、数値、連続、フォーマット(( "一番" 、 12 )。 )。
)。 ;
為に((私= 1 、私<= nitems (( nlist )。 、私++、
nm = nlist [私] ;
dt : Nアイテム[私] = nm ;
私のリスト= ((リストとして(( 1 ::: nm ))[ 1 ] ;
始める=ダニ秒() ;
randomList = pmroz_randomizeList ((私のリスト)。 ;
経過=ダニ秒() -始める;
dt : pmroz [私] =経過;
待つ(( 0 )。 ;
始める=ダニ秒() ;
randomList = jeff_randomizeList ((私のリスト)。 ;
経過=ダニ秒() -始める;
dt :ジェフ[私] =経過;
待つ(( 0 )。 ;
始める=ダニ秒() ;
randomList = byron_randomizeList ((私のリスト)。 ;
経過=ダニ秒() -始める;
dt :バイロン[私] =経過;
待つ(( 0 )。 ;
始める=ダニ秒() ;
randomList = phil_randomizeList ((私のリスト)。 ;
経過=ダニ秒() -始める;
dt :フィル[私] =経過;
待つ(( 0 )。 ;
)。 ;
dt <<グラフビルダー((コントロールパネルを表示(( 0 )。 、
変数((バツ(( : Nアイテム)。 、 Y (( : pmroz )。 、 Y (( :ジェフ、位置(( 1 )。 )。 、 Y (( :バイロン、位置(( 1 )。 )。 、
Y (( :フィル、位置(( 1 )。 )。 )。 、
要素((ポイント((バツ、 Y (( 1 )。 、 Y (( 2 )。 、 Y (( 3 )。 、 Y (( 4 )。 、伝説(( 1 )。 、ジッター(( 1 )。 )。 、
よりスムーズ((バツ、 Y (( 1 )。 、 Y (( 2 )。 、 Y (( 3 )。 、 Y (( 4 )。 、伝説(( 2 )。 )。 )。
)。 ;
Re:リストをランダム化するプライベートテーブルは非常に便利ですが、各テーブルが保持するメモリが少ないので注意してください。追跡が困難です。プライベートテーブルを作成して開くことで、すぐに大量のメモリを消費する可能性があります。また、物理ウィンドウがないため(上記の例のように)、見逃しがちです。
ただし、それらを閉じる必要がないため、時間を大幅に節約できます。それらを保持する変数を再割り当てするだけです(これは上記で意図したものですが、関数に{DefaultLocal}があることに気づいていませんでした。 --DOH!)。
スクリプトガイドから:
プライベートデータテーブル
プライベート引数を含めることにより、データテーブルをビューから完全に非表示にします。
dt = Open( "$ SAMPLE_DATA / Big Class.jmp"、 "private");
テーブルをプライベートにすると、スクリプトが多数を開いたり閉じたりするときのメモリの問題を防ぐことができます
テーブル。プライベートデータテーブルには物理ウィンドウがないため、必要なメモリは
見えないテーブル。
非表示のテーブルと同様に、プライベートデータテーブルで実行される分析はテーブルにリンクされます。
プライベートデータテーブルが失われないようにするには、前に示したように、そのテーブルに参照を割り当てる必要があります。
例。それ以外の場合、JMPはすぐにプライベートデータテーブルをメモリから削除します。
スクリプトの後半でテーブルをさらに使用すると、エラーが発生します。
Re:リストをランダム化するさらに別の方法...
//フィリップブラウン2016年7月14日9:50AM
phil_randomizeList =関数({aList}、{デフォルトローカル}、
リスト[ランク((繰り返す({ランダムなユニフォーム()}、 nitems (リスト) ) )]
);
これは組み込み関数のランダムシャッフルよりも速いとは思いませんが、Repeat({}、n)を使用して特定のアプリケーションのリストを生成するのが好きでした。
Re:リストをランダム化するTheプライベートキーワードは興味深いです-テーブルはウィンドウリストにも表示されません。少しメモリを節約できると思います。私はこれをたくさんの場所で使うことができます。ありがとうmsharp!
Re:リストをランダム化するでは、JMP 13 Insert Intoの変更で同じ問題が修正されますか?これは素晴らしいニュースです!
Re:リストをランダム化するテーブル関数は、大規模なデータセットに対して非常に効率的です。主な理由の1つは、b / c JMPが複数のコアを利用しているのに対し、JSLは利用していないことです。ただし、小さなデータセットの場合、テーブルを作成するプロセスは多くのオーバーヘッドを追加します。これを使用しているアプリケーションの場合、実際にはPMrozの回答に似たものがありましたが、リストがすべて1000未満のアイテムであったため、かなりの時間が追加されていることに気付きました。
みんな、ありがとう!
注:Today()は秒単位でのみ正確であり、Tick Seconds()は1/60秒単位で正確であり、HP TIME()はマイクロ秒単位で正確です。もちろん、これはすべてコンピュータによって異なります。また、公平を期すために、テーブルをprivateに変更し、closeステートメントを削除しました。これにより、スクリプトが高速化されます。
名前のデフォルトはここ(( 1 )。 ;
//pmrozバージョン
pmroz_randomizeList =関数({リスト} 、 {{デフォルトのローカル} 、
dt =新しいテーブル(( "" 、プライベート、
新しい列(( "データ" 、設定値((リスト)。 )。 、
新しい列(( 「ランダム化」 、数値、連続、方式((ランダムユニフォーム() )。 )。
)。 ;
dt <<選別((テーブルを交換してください、に(( :ランダム化)) ;
random_list = dt :データ<<値を取得する;
)。 ;
// Jeff Perkinson2016年7月13日14:00(Peter Mrozへの返信)
jeff_randomizeList =関数({リスト} 、 {{デフォルトのローカル} 、
リスト[ランク(( j (( nitems ((リスト)。 、 1 、ランダムなユニフォーム()))]
)。 ;
//バイロンの関数
byron_randomizeList =関数({リスト} 、 {{デフォルトのローカル} 、
nr = nitems ((リスト)。 ;
rslist =ランダムシャッフル(( 1 ::: nr )。 ;
blist =リスト[ rslist [ 1 ::: nr ]] ;
)。 ;
nm = 100 ; //リスト要素の数を設定します
imax = 100 ; //反復回数を設定します
私のリスト= ((リストとして(( 1 ::: nm ))[ 1 ] ;
始める= HPタイム() ;
為に((私= 1 、私<= imax 、私++、
randomList = pmroz_randomizeList ((私のリスト)。 ;
)。 ;
経過= HPタイム() -始める;
印刷(( 「pmroz:」 || char ((経過)) ;
待つ(( 0 )。 ;
始める= HPタイム() ;
為に((私= 1 、私<= imax 、私++、
randomList = jeff_randomizeList ((私のリスト)。 ;
)。 ;
経過= HPタイム() -始める;
印刷(( 「ジェフ:」 || char ((経過)) ;
待つ(( 0 )。 ;
始める= HPタイム() ;
為に((私= 1 、私<= imax 、私++、
randomList = byron_randomizeList ((私のリスト)。 ;
)。 ;
経過= HPタイム() -始める;
印刷(( 「バイロン:」 || char ((経過)) ;
待つ(( 0 )。 ;
//出力
「pmroz:121646」
「ジェフ:3990」
「バイロン:3488」
Re:リストをランダム化する結果はJMP13で変更されます。
ファストリスト
JMP13では400,000は次のようになります。
"pmroz:0.533333333332848"
「ジェフ:0.233333333333576」
「バイロン:0.216666666667152」
Re:リストをランダム化するとても興味深い。私のテーブルソリューションは一種の野蛮な力のように見えましたが、リスト要素の数が15,000を超えると、他の2つの関数よりも優れたパフォーマンスを発揮します。テーブル関数は明らかに非常に効率的です。

これが私が使用したコードです:
//pmrozバージョン
pmroz_randomizeList =関数({リスト} 、 {{デフォルトのローカル} 、
nr = nitems ((リスト)。 ;
dt =新しいテーブル(( "" 、見えない、行を追加(( nr )。 、
新しい列(( "データ" 、数値、連続、フォーマット(( "一番" 、 12 )。 、
設定値((リスト)。 )。 、
新しい列(( 「ランダム化」 、数値、連続、フォーマット(( "一番" 、 12 )。 、
方式((ランダムユニフォーム() )。 )。
)。 ;
dt <<選別((テーブルを交換してください、に(( :ランダム化)) ;
random_list = dt :データ<<値を取得する;
近い(( dt 、 nosave )。 ;
random_list ;
)。 ;
// Jeff Perkinson2016年7月13日14:00(Peter Mrozへの返信)
jeff_randomizeList =関数({リスト} 、 {{デフォルトのローカル} 、
リスト[ランク(( j (( nitems ((リスト)。 、 1 、ランダムなユニフォーム()))]
)。 ;
//バイロンの関数
byron_randomizeList =関数({リスト} 、 {{デフォルトのローカル} 、
nr = nitems ((リスト)。 ;
rslist =ランダムシャッフル(( 1 ::: nr )。 ;
blist =リスト[ rslist [ 1 ::: nr ]] ;
)。 ;
nm = 4000 ; //リスト要素の数を設定します
私のリスト= ((リストとして(( 1 ::: nm ))[ 1 ] ;
始める=今日() ;
randomList = pmroz_randomizeList ((私のリスト)。 ;
経過=今日() -始める;
印刷(( 「pmroz:」 || char ((経過)) ;
待つ(( 0 )。 ;
私のリスト= ((リストとして(( 1 ::: nm ))[ 1 ] ;
始める=今日() ;
randomList = jeff_randomizeList ((私のリスト)。 ;
経過=今日() -始める;
印刷(( 「ジェフ:」 || char ((経過)) ;
待つ(( 0 )。 ;
私のリスト= ((リストとして(( 1 ::: nm ))[ 1 ] ;
始める=今日() ;
randomList = byron_randomizeList ((私のリスト)。 ;
経過=今日() -始める;
印刷(( 「バイロン:」 || char ((経過)) ;
待つ(( 0 )。 ;
Re:リストをランダム化するJMPには、ほとんどの場合、何かを行うための少なくとも3つの方法があります。これが3番目です。
alistから始めて、シャッフルされた番号のリストをalist内のアイテムの数と等しくします。 次に、rslistの順序でalistの値を使用してblistを作成します。
alist = {a、b、c、 1 、 2 、 3 };
rslist =ランダムシャッフル(( 1 ::: nitems (リスト));
blist = alist [rslist [ 1 ::: nitems (リスト)]];
リストで数字や文字、または組み合わせを使用しているかどうかは関係ありません。
私はこのアイデアをJSLコンパニオンブックから得たと確信しています
-バイロン
Re:リストをランダム化するこれが私の実装です。
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);私がここで何をしているのかはっきりしない場合
- The j()関数は、乱数の行列を作成します。 [0.04757597646676、0.738883488578722、0.935981905087828、0.0233044682536274、 0.493906983872876]
- Theランク()関数は行列を返します(例:上記の場合: [4、1、5、2、3] )これは、乱数をソートした順序で元のリストを返すために使用されます。
-ジェフ
Re:リストをランダム化するこれを行う1つの方法があります。他のアプローチを見たいです!
randomizeList =関数({リスト} 、 {{デフォルトのローカル} 、
nr = nitems ((リスト)。 ;
dt =新しいテーブル(( "" 、見えない、行を追加(( nr )。 、
新しい列(( "データ" 、数値、連続、フォーマット(( "一番" 、 12 )。 、
設定値((リスト)。 )。 、
新しい列(( 「ランダム化」 、数値、連続、フォーマット(( "一番" 、 12 )。 、
方式((ランダムユニフォーム() )。 )。
)。 ;
dt <<選別((テーブルを交換してください、に(( :ランダム化)) ;
random_list = dt :データ<<値を取得する;
近い(( dt 、 nosave )。 ;
random_list ;
)。 ;
リスト= {{ 1 、 2 、 3 、 4 、 5 } ;
randomList = randomizeList ((リスト)。 ;
印刷(( randomList )。 ; //{2,4,5,1,3}のような期待される出力