목록 무작위화<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />목록을 무작위화해야 합니다.
randomizeList = 함수({목록}, {기본 로컬},
//여기에 코드가 들어갑니다.
반환 목록;
);
목록 = {1,2,3,4,5};
randomList = randomizeList(목록);
인쇄(랜덤리스트); // 예상되는 출력은 {2,4,5,1,3}과 같습니다.
이를 수행하는 방법은 많이 있으며 오답은 없습니다.어떤 피드백이든 감사합니다. 감사합니다!
Re: 목록 무작위화직선을 사랑하십시오. 목록에 대한 N^2 동작이 수정되었습니다!
Re: 목록 무작위화
방법 간의 차이가 그렇게 크지는 않지만 조금 더 잘 구별할 수 있도록 목록 크기를 늘렸습니다. 놀라운 것은 위의 결과와 이 결과 사이의 시간 차이입니다. 또한 pmroz의 방법이 10000행보다 100행에서 더 느린 것이 이상해 보입니다. 테이블을 만드는 작업을 반복했기 때문이 아닐까요?
JMP 13 베타 8
맥 2.5GHz 인텔 코어 i7
16GB 1600MHz 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 |
Re: 목록 무작위화아래 코드는 네 가지 알고리즘을 비교합니다.데이터는 테이블에 저장된 다음 그래프로 표시됩니다.JMP 13에서 이것이 어떻게 보이는지 궁금합니다.
// pmroz 버전
pmroz_randomizeList = 기능 ({ 목록 } , { 기본 로컬 } ,
nr = 니트템 ( 목록 ) ;
dt = 새 테이블 ( "" , 사적인 , 행 추가 ( nr ) ,
새 열 ( "데이터" , 숫자 , 마디 없는 , 체재 ( "최고" , 12 ) ,
값 설정 ( 목록 ) ) ,
새 열 ( "무작위" , 숫자 , 마디 없는 , 체재 ( "최고" , 12 ) ,
공식 ( 랜덤 유니폼 () ) )
) ;
dt << 종류 ( 테이블 교체 , ~에 의해 ( : 무작위 )) ;
random_list = dt : 데이터 << 값을 얻다 ;
) ;
// Jeff Perkinson 2016년 7월 13일 오후 2:00(Peter Mroz에 대한 응답)
jeff_randomizeList = 기능 ({ 목록 } , { 기본 로컬 } ,
목록 [ 계급 ( 제이 ( 니트템 ( 목록 ) , 1 , 무작위 유니폼 ()))]
) ;
// 바이런의 함수
byron_randomizeList = 기능 ({ 목록 } , { 기본 로컬 } ,
nr = 니트템 ( 목록 ) ;
rslist = 랜덤 셔플 ( 1 :: nr ) ;
물집 = 목록 [ rslist [ 1 :: nr ]] ;
) ;
// Philip Brown 2016년 7월 14일 오전 9:50
phil_randomizeList = 기능 ({ 목록 } , { 기본 로컬 } ,
목록 [ 계급 ( 반복하다 ({ 무작위 유니폼 ()} , 니트템 ( 목록 ) ) )]
) ;
nlist = { 100 , 1000 , 10000 , 20000 , 30000 , 40000 , 50000 , 70000 } ;
dt = 새 테이블 ( "무작위 목록" , 행 추가 ( 니트템 ( nlist ) ) ,
새 열 ( "N 아이템" , 숫자 , 마디 없는 , 체재 ( "최고" , 12 ) ) ,
새 열 ( "pmroz" , 숫자 , 마디 없는 , 체재 ( "최고" , 12 ) ) ,
새 열 ( "제프" , 숫자 , 마디 없는 , 체재 ( "최고" , 12 ) ) ,
새 열 ( "바이런" , 숫자 , 마디 없는 , 체재 ( "최고" , 12 ) ) ,
새 열 ( "필" , 숫자 , 마디 없는 , 체재 ( "최고" , 12 ) )
) ;
~을 위한 ( 나 = 1 , 나 <= 니트템 ( nlist ) , 나 ++,
nm = nlist [ 나 ] ;
dt : N 항목 [ 나 ] = nm ;
나의 목록 = ( 목록으로 ( 1 :: nm ))[ 1 ] ;
시작 = 틱 초 () ;
랜덤리스트 = pmroz_randomizeList ( 나의 목록 ) ;
경과 = 틱 초 () - 시작 ;
dt : pmroz [ 나 ] = 경과 ;
기다리다 ( 0 ) ;
시작 = 틱 초 () ;
랜덤리스트 = jeff_randomizeList ( 나의 목록 ) ;
경과 = 틱 초 () - 시작 ;
dt : 제프 [ 나 ] = 경과 ;
기다리다 ( 0 ) ;
시작 = 틱 초 () ;
랜덤리스트 = byron_randomizeList ( 나의 목록 ) ;
경과 = 틱 초 () - 시작 ;
dt : 바이런 [ 나 ] = 경과 ;
기다리다 ( 0 ) ;
시작 = 틱 초 () ;
랜덤리스트 = phil_randomizeList ( 나의 목록 ) ;
경과 = 틱 초 () - 시작 ;
dt : 필 [ 나 ] = 경과 ;
기다리다 ( 0 ) ;
) ;
dt << 그래프 빌더 ( 제어판 표시 ( 0 ) ,
변수 ( 엑스 ( : N 항목 ) , 와이 ( : pmroz ) , 와이 ( : 제프 , 위치 ( 1 ) ) , 와이 ( : 바이런 , 위치 ( 1 ) ) ,
와이 ( : 필 , 위치 ( 1 ) ) ) ,
집단 ( 포인트들 ( 엑스 , 와이 ( 1 ) , 와이 ( 2 ) , 와이 ( 삼 ) , 와이 ( 4 ) , 전설 ( 1 ) , 지터 ( 1 ) ) ,
더 매끄럽게 ( 엑스 , 와이 ( 1 ) , 와이 ( 2 ) , 와이 ( 삼 ) , 와이 ( 4 ) , 전설 ( 2 ) ) )
) ;
Re: 목록 무작위화개인 테이블은 매우 유용하지만 각 테이블이 더 적은 메모리를 보유하는 동안 조심해야 합니다. 추적하기가 더 어렵습니다.개인 테이블을 만들고 열면 많은 메모리를 빠르게 차지할 수 있으며 물리적 창이 없기 때문에 놓치기 쉽습니다(위의 예에서와 같이).
그러나 닫을 필요가 없기 때문에 많은 시간을 절약할 수 있습니다. 변수를 보유하는 변수를 재할당하면 됩니다(위에서 의도했지만 함수에 {Default Local}이 있다는 것을 깨닫지 못했습니다. -- 도!).
스크립팅 가이드에서:
개인 데이터 테이블
개인 인수를 포함하여 보기에서 데이터 테이블을 완전히 숨깁니다.
dt = Open( "$SAMPLE_DATA/빅 클래스.jmp", "비공개" );
테이블을 개인용으로 만들면 스크립트가 여러 개를 열고 닫을 때 메모리 문제를 방지할 수 있습니다.
테이블. 개인 데이터 테이블에는 물리적 창이 없기 때문에 메모리가 필요합니다.
보이지 않는 테이블.
보이지 않는 테이블과 마찬가지로 개인 데이터 테이블에서 실행되는 분석은 테이블에 연결됩니다.
개인 데이터 테이블의 손실을 방지하려면 앞의 그림과 같이 참조를 할당해야 합니다.
예시. 그렇지 않으면 JMP가 메모리에서 개인 데이터 테이블을 즉시 제거합니다.
나중에 스크립트에서 테이블을 추가로 사용하면 오류가 발생합니다.
Re: 목록 무작위화또 다른 방법....
// Philip Brown 2016년 7월 14일 오전 9:50
phil_randomizeList = 기능 ({aList},{기본 로컬},
목록[ 계급 ( 반복하다 ({ 무작위 유니폼 ()}, 니트템 (목록) ) )]
);
이것이 내장 기능인 Random Shuffle보다 빠르다고 생각하지 않지만 저는 항상 Repeat({}, n)을 사용하여 특정 응용 프로그램에 대한 목록을 생성하는 것을 좋아했습니다.
Re: 목록 무작위화그만큼 사적인 키워드가 흥미롭습니다. 테이블은 창 목록에도 표시되지 않습니다.나는 그것이 약간의 메모리를 절약한다고 상상합니다.여러 곳에서 이것을 사용할 수 있습니다.msharp 감사합니다!
Re: 목록 무작위화JMP 13 Insert Into 변경으로 동일한 문제가 해결됩니까?이것은 좋은 소식입니다!
Re: 목록 무작위화테이블 함수는 대규모 데이터 세트에 매우 효율적입니다.주된 이유 중 하나는 b/c JMP가 다중 코어를 활용하는 반면 JSL은 그렇지 않기 때문입니다.그러나 작은 데이터 세트의 경우 테이블 생성 프로세스가 많은 오버헤드를 추가합니다.내가 이것을 사용하는 응용 프로그램의 경우 실제로 PMroz의 답변과 유사한 것이 있었지만 내 목록이 모두 <1000개 항목이었기 때문에 시간이 꽤 많이 추가되고 있음을 알았습니다.
모두 감사합니다!
참고: Today()는 초 단위까지만 정확하고 Tick Seconds()는 1/60초까지 정확하며 HP TIME()은 마이크로초 단위로 정확합니다.물론 이것은 모두 컴퓨터에 따라 다릅니다.또한 공정한 이점을 제공하기 위해 테이블을 비공개로 변경하고 닫기 문을 제거하여 스크립트 속도를 높였습니다.
이름 기본값은 여기 ( 1 ) ;
// pmroz 버전
pmroz_randomizeList = 기능 ({ 목록 } , { 기본 로컬 } ,
dt = 새 테이블 ( "" , 사적인 ,
새 열 ( "데이터" , 값 설정 ( 목록 ) ) ,
새 열 ( "무작위" , 숫자 , 마디 없는 , 공식 ( 랜덤 유니폼 () ) )
) ;
dt << 종류 ( 테이블 교체 , ~에 의해 ( : 무작위 )) ;
random_list = dt : 데이터 << 값을 얻다 ;
) ;
// Jeff Perkinson 2016년 7월 13일 오후 2:00(Peter Mroz에 대한 응답)
jeff_randomizeList = 기능 ({ 목록 } , { 기본 로컬 } ,
목록 [ 계급 ( 제이 ( 니트템 ( 목록 ) , 1 , 무작위 유니폼 ()))]
) ;
// 바이런의 함수
byron_randomizeList = 기능 ({ 목록 } , { 기본 로컬 } ,
nr = 니트템 ( 목록 ) ;
rslist = 랜덤 셔플 ( 1 :: nr ) ;
물집 = 목록 [ rslist [ 1 :: nr ]] ;
) ;
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에서 변경됩니다.
빠른 목록
400,000은 JMP 13에서 다음과 같습니다.
"pmroz: 0.533333333332848"
"제프: 0.233333333333576"
"바이런: 0.216666666667152"
Re: 목록 무작위화매우 흥미로운.내 테이블 솔루션은 일종의 무차별 대입처럼 보이지만 목록 요소의 수가 15,000개를 초과하면 다른 두 기능보다 성능이 뛰어납니다. 테이블 기능은 분명히 매우 효율적입니다.

내가 사용한 코드는 다음과 같습니다.
// pmroz 버전
pmroz_randomizeList = 기능 ({ 목록 } , { 기본 로컬 } ,
nr = 니트템 ( 목록 ) ;
dt = 새 테이블 ( "" , 보이지 않는 , 행 추가 ( nr ) ,
새 열 ( "데이터" , 숫자 , 마디 없는 , 체재 ( "최고" , 12 ) ,
값 설정 ( 목록 ) ) ,
새 열 ( "무작위" , 숫자 , 마디 없는 , 체재 ( "최고" , 12 ) ,
공식 ( 랜덤 유니폼 () ) )
) ;
dt << 종류 ( 테이블 교체 , ~에 의해 ( : 무작위 )) ;
random_list = dt : 데이터 << 값을 얻다 ;
닫다 ( dt , 노사브 ) ;
random_list ;
) ;
// Jeff Perkinson 2016년 7월 13일 오후 2:00(Peter Mroz에 대한 응답)
jeff_randomizeList = 기능 ({ 목록 } , { 기본 로컬 } ,
목록 [ 계급 ( 제이 ( 니트템 ( 목록 ) , 1 , 무작위 유니폼 ()))]
) ;
// 바이런의 함수
byron_randomizeList = 기능 ({ 목록 } , { 기본 로컬 } ,
nr = 니트템 ( 목록 ) ;
rslist = 랜덤 셔플 ( 1 :: nr ) ;
물집 = 목록 [ rslist [ 1 :: nr ]] ;
) ;
nm = 4000 ; // 목록 요소의 수를 설정합니다.
나의 목록 = ( 목록으로 ( 1 :: nm ))[ 1 ] ;
시작 = 오늘 () ;
랜덤리스트 = pmroz_randomizeList ( 나의 목록 ) ;
경과 = 오늘 () - 시작 ;
인쇄 ( "pmroz: " || 숯 ( 경과 )) ;
기다리다 ( 0 ) ;
나의 목록 = ( 목록으로 ( 1 :: nm ))[ 1 ] ;
시작 = 오늘 () ;
랜덤리스트 = jeff_randomizeList ( 나의 목록 ) ;
경과 = 오늘 () - 시작 ;
인쇄 ( "제프: " || 숯 ( 경과 )) ;
기다리다 ( 0 ) ;
나의 목록 = ( 목록으로 ( 1 :: nm ))[ 1 ] ;
시작 = 오늘 () ;
랜덤리스트 = byron_randomizeList ( 나의 목록 ) ;
경과 = 오늘 () - 시작 ;
인쇄 ( "바이런: " || 숯 ( 경과 )) ;
기다리다 ( 0 ) ;
Re: 목록 무작위화JMP에는 거의 항상 최소한 세 가지 방법이 있습니다.여기 세 번째가 있습니다.
목록으로 시작하여 목록의 항목 수와 동일한 숫자 섞은 목록을 만듭니다. 그런 다음 rslist의 순서로 list의 값으로 blist를 만듭니다.
명단={a,b,c, 1 , 2 , 삼 };
rslist= 랜덤 셔플 ( 1 :: 니트템 (목록));
blist=목록[rslist[ 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);내가 여기서 무엇을 하고 있는지 명확하지 않은 경우
- 그만큼 제이() 함수는 난수 행렬을 생성합니다. 예: [0.04757597646676, 0.738883488578722, 0.935981905087828, 0.0233044682536274, 0.493906983872876]
- 그만큼 계급() 함수는 행렬을 반환합니다(예: 위의 경우: [4, 1, 5, 2, 3] ) 난수를 정렬한 순서대로 원래 목록을 반환하는 데 사용됩니다.
-제프
Re: 목록 무작위화한 가지 방법이 있습니다.다른 접근 방식을 보고 싶습니다!
무작위 목록 = 기능 ({ 목록 } , { 기본 로컬 } ,
nr = 니트템 ( 목록 ) ;
dt = 새 테이블 ( "" , 보이지 않는 , 행 추가 ( nr ) ,
새 열 ( "데이터" , 숫자 , 마디 없는 , 체재 ( "최고" , 12 ) ,
값 설정 ( 목록 ) ) ,
새 열 ( "무작위" , 숫자 , 마디 없는 , 체재 ( "최고" , 12 ) ,
공식 ( 랜덤 유니폼 () ) )
) ;
dt << 종류 ( 테이블 교체 , ~에 의해 ( : 무작위 )) ;
random_list = dt : 데이터 << 값을 얻다 ;
닫다 ( dt , 노사브 ) ;
random_list ;
) ;
목록 = { 1 , 2 , 삼 , 4 , 5 } ;
랜덤리스트 = 무작위 목록 ( 목록 ) ;
인쇄 ( 랜덤리스트 ) ; // 예상되는 출력은 {2,4,5,1,3}과 같습니다.