リストをランダム化する<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />リストをランダム化する必要があります。
randomizeList = Function({リスト}, {デフォルトのローカル},
// ここにコードが入ります
リストを返す;
);
リスト = {1,2,3,4,5};
ランダムリスト = ランダム化リスト(リスト);
print(ランダムリスト); // {2,4,5,1,3} のような出力が期待されます
これを行う方法はたくさんあり、間違った答えはありません。フィードバックをお待ちしております。ありがとうございます!
Re: リストをランダム化する直線が大好きです。リストの N^2 動作が修正されました。
Re: リストをランダム化する
メソッド間の違いはそれほど大きくありませんが、区別しやすくするためにリストのサイズを大きくしました。 驚くべきことは、上記の結果とこれらの結果の間に時間差があることです。 また、pmroz のメソッドが 100 行の場合よりも 100 行の場合の方が遅いのは奇妙に思えます。 表を作る作業を繰り返しているせいでしょうか?
JMP 13 ベータ 8
Mac 2.5 GHz インテル Core i7
16GB 1600MHz DDR3
| N 個のアイテム | ピムローズ | ジェフ | バイロン | フィル |
| 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 |
Re: リストをランダム化する以下のコードは 4 つのアルゴリズムを比較しています。データはテーブルに保存され、グラフ化されます。これが JMP 13 ではどうなるか興味がありますか?
// pmrozのバージョン
pmroz_randomizeList =関数({リスト} 、 {デフォルトのローカル} 、
番号=ナイアイテム(リスト) ;
dt =新しいテーブル( 「」 、プライベート、行の追加(番号) 、
新しい列( "データ" 、数値、継続的、フォーマット( "最高" 、 12 ) 、
設定値(リスト) ) 、
新しい列( 「ランダム化」 、数値、継続的、フォーマット( "最高" 、 12 ) 、
式(ランダムユニフォーム() ) )
) ;
dt <<選別(テーブルを置き換える、による( :ランダム化)) ;
ランダムリスト= dt :データ<<値を取得する;
) ;
// Jeff Perkinson 2016 年 7 月 13 日 2:00 PM (Peter Mroz への返答)
jeff_randomizeList =関数({リスト} 、 {デフォルトのローカル} 、
リスト[ランク( j (ナイアイテム(リスト) 、 1 、ランダムなユニフォーム()))]
) ;
// バイロン関数
byron_randomizeList =関数({リスト} 、 {デフォルトのローカル} 、
番号=ナイアイテム(リスト) ;
rsリスト=ランダムシャッフル( 1 ::番号) ;
水疱=リスト[ rsリスト[ 1 ::番号]] ;
) ;
// フィリップ・ブラウン 2016年7月14日 9:50 AM
phil_randomizeList =関数({リスト} 、 {デフォルトのローカル} 、
リスト[ランク(繰り返す({ランダムなユニフォーム()} 、ナイアイテム(リスト) ) )]
) ;
nlist = { 100 、 1000 、 10000 、 20000 、 30000 、 40000 、 50000 、 70000 } ;
dt =新しいテーブル( 「ランダムリスト」 、行の追加(ナイアイテム( nlist ) ) 、
新しい列( 「N個のアイテム」 、数値、継続的、フォーマット( "最高" 、 12 ) ) 、
新しい列( 「ピームローズ」 、数値、継続的、フォーマット( "最高" 、 12 ) ) 、
新しい列( 「ジェフ」 、数値、継続的、フォーマット( "最高" 、 12 ) ) 、
新しい列( 「バイロン」 、数値、継続的、フォーマット( "最高" 、 12 ) ) 、
新しい列( 「フィル」 、数値、継続的、フォーマット( "最高" 、 12 ) )
) ;
のために(私= 1 、私<=ナイアイテム( nlist ) 、私++、
nm = nlist [私] ;
dt : N 個のアイテム[私] = nm ;
私のリスト= (リストとして( 1 :: nm ))[ 1 】 ;
始める=秒を刻む() ;
ランダムリスト= pmroz_randomizeList (私のリスト) ;
経過=秒を刻む() -始める;
dt :ピムローズ[私】 =経過;
待って( 0 ) ;
始める=秒を刻む() ;
ランダムリスト= jeff_randomizeList (私のリスト) ;
経過=秒を刻む() -始める;
dt :ジェフ[私】 =経過;
待って( 0 ) ;
始める=秒を刻む() ;
ランダムリスト= byron_randomizeList (私のリスト) ;
経過=秒を刻む() -始める;
dt :バイロン[私】 =経過;
待って( 0 ) ;
始める=秒を刻む() ;
ランダムリスト= phil_randomizeList (私のリスト) ;
経過=秒を刻む() -始める;
dt :フィル[私】 =経過;
待って( 0 ) ;
) ;
dt <<グラフビルダー(コントロールパネルを表示( 0 ) 、
変数(バツ( : N 個のアイテム) 、 Y ( :ピムローズ) 、 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: リストをランダム化するプライベート テーブルは非常に便利ですが、各テーブルが保持するメモリの量が少ないことに注意してください。それらを追跡するのはさらに困難です。プライベート テーブルを作成して開くと、すぐに多くのメモリを消費する可能性がありますが、(上記の例のように) プライベート テーブルには物理ウィンドウがないため、見落とされやすくなります。
ただし、それらを閉じる必要がなく、それらを保持する変数を再割り当てするだけで済むため、時間を大幅に節約できます (これが上記の目的でしたが、関数に {Default Local} があることに気づきませんでした) -- ああ!)。
スクリプトガイドから:
プライベートデータテーブル
private 引数を含めることで、データ テーブルをビューから完全に非表示にします。
dt = Open( "$SAMPLE_DATA/Big Class.jmp", "private" );
テーブルをプライベートにすると、スクリプトで多くのテーブルを開いたり閉じたりするときのメモリの問題を防ぐことができます。
テーブル。プライベート データ テーブルには物理ウィンドウがないため、プライベート データ テーブルよりも必要なメモリが少なくなります。
目に見えないテーブル。
非表示テーブルの場合と同様、プライベート データ テーブルで実行される分析はテーブルにリンクされます。
プライベート データ テーブルの損失を避けるには、前に示したように、プライベート データ テーブルに参照を割り当てる必要があります。
例。それ以外の場合、JMP はプライベート データ テーブルをメモリから即座に削除します。
スクリプトの後半でテーブルをさらに使用すると、エラーが生成されます。
Re: リストをランダム化するさらに別の方法....
// フィリップ・ブラウン 2016年7月14日 9:50 AM
phil_randomizeList =関数({aList},{デフォルトのローカル},
リスト[ランク(繰り返す({ランダムなユニフォーム()}、ナイアイテム(リスト) ) )]
);
これが組み込み関数 Random Shuffle より速いとは思いませんが、私は常に、Repeat({}, n) を使用して特定のアプリケーション用のリストを生成するのが好きでした。
Re: リストをランダム化するのプライベートキーワードは興味深いです。テーブルはウィンドウのリストにも表示されません。少しメモリを節約できると思います。これなら色々なところで使えますね。ありがとうMSシャープ!
Re: リストをランダム化するでは、JMP 13 の Insert Into の変更により、同じ問題が解決されるのでしょうか?これは素晴らしいニュースです!
Re: リストをランダム化するテーブル関数は、大規模なデータ セットに対して非常に効率的です。主な理由の 1 つは、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 PM (Peter Mroz への返答)
jeff_randomizeList =関数({リスト} 、 {デフォルトのローカル} 、
リスト[ランク( j (ナイアイテム(リスト) 、 1 、ランダムなユニフォーム()))]
) ;
// バイロン関数
byron_randomizeList =関数({リスト} 、 {デフォルトのローカル} 、
番号=ナイアイテム(リスト) ;
rsリスト=ランダムシャッフル( 1 ::番号) ;
水疱=リスト[ rsリスト[ 1 ::番号]] ;
) ;
nm = 100 ; // リスト要素の数を設定します
アイマックス= 100 ; // 反復回数を設定する
私のリスト= (リストとして( 1 :: nm ))[ 1 】 ;
始める= HP時間() ;
のために(私= 1 、私<=アイマックス、私++、
ランダムリスト= pmroz_randomizeList (私のリスト) ;
) ;
経過= HP時間() -始める;
印刷する( "pmroz:" ||文字(経過)) ;
待って( 0 ) ;
始める= HP時間() ;
のために(私= 1 、私<=アイマックス、私++、
ランダムリスト= jeff_randomizeList (私のリスト) ;
) ;
経過= HP時間() -始める;
印刷する( 「ジェフ:」 ||チャー(経過)) ;
待って( 0 ) ;
始める= HP時間() ;
のために(私= 1 、私<=アイマックス、私++、
ランダムリスト= byron_randomizeList (私のリスト) ;
) ;
経過= HP時間() -始める;
印刷する( 「バイロン:」 ||文字(経過)) ;
待って( 0 ) ;
//出力
「pmroz: 121646」
「ジェフ:3990」
「バイロン:3488」
Re: リストをランダム化するJMP 13 では結果が変わります。
ファーストリスト
JMP 13 では、400,000 は次のようになります。
「pmroz: 0.533333333332848」
「ジェフ: 0.233333333333576」
「バイロン: 0.216666666667152」
Re: リストをランダム化するとても興味深い。私のテーブル ソリューションは強引なように見えましたが、リスト要素の数が 15,000 を超えると、他の 2 つの関数よりも優れたパフォーマンスを発揮します。テーブル関数は明らかに非常に効率的です。

私が使用したコードは次のとおりです。
// pmrozのバージョン
pmroz_randomizeList =関数({リスト} 、 {デフォルトのローカル} 、
番号=ナイアイテム(リスト) ;
dt =新しいテーブル( 「」 、見えない、行の追加(番号) 、
新しい列( "データ" 、数値、継続的、フォーマット( "最高" 、 12 ) 、
設定値(リスト) ) 、
新しい列( 「ランダム化」 、数値、継続的、フォーマット( "最高" 、 12 ) 、
式(ランダムユニフォーム() ) )
) ;
dt <<選別(テーブルを置き換える、による( :ランダム化)) ;
ランダムリスト= dt :データ<<値を取得する;
近い( dt 、保存しない) ;
ランダムリスト;
) ;
// Jeff Perkinson 2016 年 7 月 13 日 2:00 PM (Peter Mroz への返答)
jeff_randomizeList =関数({リスト} 、 {デフォルトのローカル} 、
リスト[ランク( j (ナイアイテム(リスト) 、 1 、ランダムなユニフォーム()))]
) ;
// バイロン関数
byron_randomizeList =関数({リスト} 、 {デフォルトのローカル} 、
番号=ナイアイテム(リスト) ;
rsリスト=ランダムシャッフル( 1 ::番号) ;
水疱=リスト[ rsリスト[ 1 ::番号]] ;
) ;
nm = 4000 ; // リスト要素の数を設定します
私のリスト= (リストとして( 1 :: nm ))[ 1 】 ;
始める=今日() ;
ランダムリスト= pmroz_randomizeList (私のリスト) ;
経過=今日() -始める;
印刷する( "pmroz:" ||文字(経過)) ;
待って( 0 ) ;
私のリスト= (リストとして( 1 :: nm ))[ 1 】 ;
始める=今日() ;
ランダムリスト= jeff_randomizeList (私のリスト) ;
経過=今日() -始める;
印刷する( 「ジェフ:」 ||文字(経過)) ;
待って( 0 ) ;
私のリスト= (リストとして( 1 :: nm ))[ 1 】 ;
始める=今日() ;
ランダムリスト= byron_randomizeList (私のリスト) ;
経過=今日() -始める;
印刷する( 「バイロン:」 ||文字(経過)) ;
待って( 0 ) ;
Re: リストをランダム化するJMP では、ほとんどの場合、何を行うにも少なくとも 3 つの方法があります。それでは3つ目です。
alist から始めて、alist 内の項目の数に等しいシャッフルされた数値のリストを作成します。 次に、rslist の順に alist の値を使用して blist を作成します。
alist={a,b,c, 1 、 2 、 3 };
rslist=ランダムシャッフル( 1 ::ナイアイテム(リスト));
ブリスト=アリスト[rsリスト[ 1 ::ナイアイテム(リスト)]];
リスト内で数字、文字、またはその組み合わせを使用しているかどうかは関係ありません。
このアイデアは 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);ここで何をしているのかが不明瞭な場合に備えて
- のj()関数は乱数の行列を作成します。例: [0.04757597646676、0.738883488578722、0.935981905087828、0.0233044682536274、 0.493906983872876]
- のランク()関数は行列を返します (たとえば、上記の場合: [4、1、5、2、3] ) 乱数をソートした順序で元のリストを返すために使用されます。
-ジェフ
Re: リストをランダム化するここではその方法の 1 つを紹介します。他のアプローチも見てみたいです!
ランダム化リスト=関数({リスト} 、 {デフォルトのローカル} 、
番号=ナイアイテム(リスト) ;
dt =新しいテーブル( 「」 、見えない、行の追加(番号) 、
新しい列( "データ" 、数値、継続的、フォーマット( "最高" 、 12 ) 、
設定値(リスト) ) 、
新しい列( 「ランダム化」 、数値、継続的、フォーマット( "最高" 、 12 ) 、
式(ランダムユニフォーム() ) )
) ;
dt <<選別(テーブルを置き換える、による( :ランダム化)) ;
ランダムリスト= dt :データ<<値を取得する;
近い( dt 、保存しない) ;
ランダムリスト;
) ;
リスト= { 1 、 2 、 3 、 4 、 5 } ;
ランダムリスト=ランダム化リスト(リスト) ;
印刷する(ランダムリスト) ; // {2,4,5,1,3} のような出力が期待されます
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);
ここで何をしているのか分からない場合は
- j()関数は乱数の行列を作成します。例: [0.04757597646676, 0.738883488578722, 0.935981905087828, 0.0233044682536274, 0.493906983872876]
- ランク()関数は、ランダムな数字をソートした順序で元のリストを返すために使用される行列 (上記の例: [4、1、5、2、3] ) を返します。
-ジェフ
Re: リストをランダム化するこれが一つの方法です。他のアプローチもぜひ見てみたいです!
randomizeList = Function({List}, {Default Local},
nr = nitems(List);
dt = New Table( "", invisible, Add Rows( nr ),
New Column( "Data", Numeric, Continuous, Format( "Best", 12 ),
Set Values( List ) ),
New Column( "Randomized", Numeric, Continuous, Format( "Best", 12 ),
Formula( Random Uniform() ) )
);
dt << sort(replace table, by(:Randomized));
random_list = dt:Data << get values;
close(dt, nosave);
random_list;
);
list = {1,2,3,4,5};
randomList = randomizeList(list);
print(randomList); //Expected output something like {2,4,5,1,3}
リストをランダム化するリストをランダム化する必要があります。
randomizeList = Function({List}, {Default Local},
//Code goes here
return List;
);
list = {1,2,3,4,5};
randomList = randomizeList(list);
print(randomList); //Expected output something like {2,4,5,1,3}
やり方はたくさんあり、どれも正解ではありません。フィードバックをいただければ幸いです。ありがとうございます!
マスカスタマイゼーションRe: リストをランダム化するとても興味深いですね。私のテーブルを使ったソリューションは、ちょっと力任せに思えましたが、リスト要素数が15,000を超えると他の2つの関数よりもパフォーマンスが優れています。テーブル関数は明らかに非常に効率的です。

私が使用したコードは次のとおりです。
// pmroz version
pmroz_randomizeList = Function({aList}, {Default Local},
nr = nitems(aList);
dt = New Table( "", invisible, Add Rows( nr ),
New Column( "Data", Numeric, Continuous, Format( "Best", 12 ),
Set Values( aList ) ),
New Column( "Randomized", Numeric, Continuous, Format( "Best", 12 ),
Formula( Random Uniform() ) )
);
dt << sort(replace table, by(:Randomized));
random_list = dt:Data << get values;
close(dt, nosave);
random_list;
);
// Jeff Perkinson Jul 13, 2016 2:00 PM (in response to Peter Mroz)
jeff_randomizeList =Function({aList},{Default Local},
aList[rank(j(nitems(aList), 1, random uniform()))]
);
// Byron's function
byron_randomizeList = Function({aList},{Default Local},
nr = nitems(alist);
rslist = random shuffle(1::nr);
blist = alist[rslist[1::nr]];
);
nm = 4000; // Set the number of list elements
my_list = (as list(1::nm))[1];
start = today();
randomList = pmroz_randomizeList(my_list);
elapsed = today() - start;
print("pmroz: " || char(elapsed));
wait(0);
my_list = (as list(1::nm))[1];
start = today();
randomList = jeff_randomizeList(my_list);
elapsed = today() - start;
print("Jeff: " || char(elapsed));
wait(0);
my_list = (as list(1::nm))[1];
start = today();
randomList = byron_randomizeList(my_list);
elapsed = today() - start;
print("Byron: " || char(elapsed));
wait(0);
Re: リストをランダム化するテーブル関数は大規模なデータセットで非常に効率的です。主な理由の一つは、JMPは複数のコアを活用するのに対し、JSLはそうではないことです。しかし、小規模なデータセットでは、テーブル作成プロセスによって大きなオーバーヘッドが発生します。私がこの関数を使用しているアプリケーションでは、PMrozさんの回答と似たような状況に陥っていましたが、リストの項目数がすべて1000未満だったため、かなりの時間がかかっていることに気づきました。
みなさんありがとう!
注:Today() は秒単位の精度、Tick Seconds() は1/60秒単位の精度、HP TIME() はマイクロ秒単位の精度です。もちろん、これはお使いのコンピュータによって異なります。また、公平を期すために、テーブルをプライベートに変更し、close ステートメントを削除しました。これにより、スクリプトの速度が向上します。
Names Default to Here(1);
// pmroz version
pmroz_randomizeList = Function({aList}, {Default Local},
dt = New Table( "", private,
New Column( "Data", Set Values( aList ) ),
New Column( "Randomized", Numeric, Continuous, Formula( Random Uniform() ) )
);
dt << sort(replace table, by(:Randomized));
random_list = dt:Data << get values;
);
// Jeff Perkinson Jul 13, 2016 2:00 PM (in response to Peter Mroz)
jeff_randomizeList =Function({aList},{Default Local},
aList[rank(j(nitems(aList), 1, random uniform()))]
);
// Byron's function
byron_randomizeList = Function({aList},{Default Local},
nr = nitems(alist);
rslist = random shuffle(1::nr);
blist = alist[rslist[1::nr]];
);
nm = 100; // Set the number of list elements
imax = 100; // Set number of iterations
my_list = (as list(1::nm))[1];
start = HP TIME();
For(i=1, i<=imax, i++,
randomList = pmroz_randomizeList(my_list);
);
elapsed = HP TIME() - start;
print("pmroz: " || char(elapsed));
wait(0);
start = HP TIME();
For(i=1, i<=imax, i++,
randomList = jeff_randomizeList(my_list);
);
elapsed = HP TIME() - start;
print("Jeff: " || char(elapsed));
wait(0);
start = HP TIME();
For(i=1, i<=imax, i++,
randomList = byron_randomizeList(my_list);
);
elapsed = HP TIME() - start;
print("Byron: " || char(elapsed));
wait(0);
//OUTPUT
"pmroz: 121646"
"Jeff: 3990"
"Byron: 3488"