mql5 언어의 특징, 미묘함 및 작업 방법 - 페이지 135

 
Vict :

세심한 주의를 기울이고 있습니다. 감사합니다. 내가 실수를 했고, 대괄호를 넣지 않았고, "부정직한" 기능을 사용했을 것입니다.

추신: 원본 게시물을 수정했습니다.

이 구성이 평범한 rand()%max보다 나은 이유를 설명하십시오.

PS 무슨 말인지 이해합니다.
그렇다면 최대>32767이면 어떻게 될까요? 결국, 함수는 uint 유형 이고 rand()와 같은 최대값을 생성합니다. 32767

다음과 같은 것을 사용하는 것이 좋습니다

 ulong RandULong( ulong max= ULONG_MAX ) { return ((( ulong ) rand ()<< 60 )|(( ulong ) rand ()<< 45 )|(( ulong ) rand ()<< 30 )|(( ulong ) rand ()<< 15 )|( ulong ) rand ())%max;}
 
Vict :

당신은 매우 세심합니다. 감사합니다. 내가 실수를 했고, 대괄호를 넣지 않았고, "부정직한" 기능을 사용했을 것입니다.

PS: 원본 게시물을 수정했습니다.

누군가가 당신의 정직한 함수를 사용하기를 원하고 get_rand(10)을 작성하면 rand()%10보다 3276배 느리게 작동한다는 것을 알고 있습니까?

 
Nikolai Semko :

그렇다면 최대>32767이면 어떻게 될까요? 결국, 함수는 uint 유형 이고 rand()와 같은 최대값을 생성합니다. 32767

다음과 같은 것을 사용하는 것이 좋습니다

그리고 MathRand()는 int를 반환합니다. 누군가 6개의 0이 포함된 숫자를 기대한다면 어떻게 될까요? 나는 대중의 어느 정도 수준에 의존하고 있다. 여기, 당신은> 32767을 얻는 방법을 알고 있습니다.

그냥 주저하지 않고 rand()%3을 쓰는 경우가 많지만 그들은 내 메시지를 보고 확률에 변화가 있음을 깨닫게 될 것입니다.

누군가가 당신의 정직한 함수를 사용하기를 원하고 get_rand(10)을 작성하면 rand()%10보다 3276배 느리게 작동한다는 것을 알고 있습니까?

네, 아주 천천히, 백만 호출 주기 동안 while 반복 호출은 약 300번 발생합니다. 프로그램이 get_rand()가 트위치하는 ()에 대한 베어로 구성되어 있으면 이것이 중요할 것입니다.

OS 스케줄러가 CPU 시간을 많이 잡아먹고 rand()와 비교할 수 없을 정도로 실행 속도가 느려진다는 사실을 알고 계셨습니까? 당신이 너무 급하니까, 당신이 약간의 dos가 필요합니다.

 
Vict :

그리고 MathRand()는 int를 반환합니다. 누군가 6개의 0이 포함된 숫자를 기대한다면 어떻게 될까요? 나는 대중의 어느 정도 수준에 의존하고 있다. 여기, 당신은> 32767을 얻는 방법을 알고 있습니다.

그냥 주저하지 않고 rand()%3을 쓰는 경우가 많지만 그들은 내 메시지를 보고 확률에 변화가 있음을 깨닫게 될 것입니다.

네, 아주 천천히, 백만 호출 주기 동안 while 반복 호출은 약 300번 발생합니다. 프로그램이 get_rand()가 트위치하는 ()에 대한 베어로 구성되어 있으면 이것이 중요할 것입니다.

OS 스케줄러가 CPU 시간을 많이 잡아먹고 rand()와 비교할 수 없을 정도로 실행 속도가 느려진다는 사실을 알고 계셨습니까? 당신이 너무 급하니까, 당신이 약간의 dos가 필요합니다.

함수의 속도는 최적화에서 매우 중요합니다. 그리고 그것은 스케줄러와 DOS에 관한 것이 아닙니다.
 
Vict :

그리고 MathRand()는 int를 반환합니다. 누군가 6개의 0이 포함된 숫자를 기대한다면 어떻게 될까요? 나는 대중의 어느 정도 수준에 의존하고 있다. 여기에서 > 32767을 얻는 방법을 스스로 알고 있습니다.

그냥 주저하지 않고 rand()%3을 쓰는 경우가 많지만 그들은 내 메시지를 보고 확률에 변화가 있음을 깨닫게 될 것입니다.

네, 아주 천천히, 백만 호출 주기 동안 while 반복 호출은 약 300번 발생합니다. 프로그램이 get_rand()가 트위치하는 ()에 대한 베어로 구성되어 있으면 이것이 중요할 것입니다.

OS 스케줄러가 CPU 시간을 많이 잡아먹고 rand()와 비교할 수 없을 정도로 실행 속도가 느려진다는 사실을 알고 계셨습니까? 당신이 너무 급하니까, 당신이 약간의 dos가 필요합니다.

실수를 인정하는 것을 두려워하지 마십시오. 여기에는 끔찍하고 굴욕적인 것이 없습니다. 우리는 모두 실수를 해요. 이건 괜찮아.
"예, 제가 틀렸습니다. 감사합니다."라고 말하는 것이 커뮤니티 인식 측면에서 훨씬 쉽고 유용합니다. 핑계를 대려고 하는 대신.

결국 이 옵션은 훨씬 빠르고 다양하게 작동합니다.

 ulong randUlong( ulong max= ULONG_MAX )
  {
   static bool f= true ;
   if (f) {f= false ; srand ( GetTickCount ());}
   return ((( ulong ) rand ()<< 60 )|(( ulong ) rand ()<< 45 )|(( ulong ) rand ()<< 30 )|(( ulong ) rand ()<< 15 )|( ulong ) rand ())%max;
  }

큰 숫자가 필요하지 않은 경우(5가 아닌 3랜드()가 됨) ulong을 uint로 다시 코딩하면 속도를 높일 수도 있습니다.

 
Nikolai Semko :

실수를 인정하는 것을 두려워하지 마십시오. 여기에는 끔찍하고 굴욕적인 것이 없습니다. 우리는 모두 실수를 해요. 이건 괜찮아.
"예, 제가 틀렸습니다. 감사합니다."라고 말하는 것이 커뮤니티 인식 측면에서 훨씬 쉽고 유용합니다. 핑계를 대려고 하는 대신.

결국 이 옵션은 훨씬 빠르고 다양하게 작동합니다.

큰 숫자가 필요하지 않은 경우(5가 아닌 3랜드()가 됨) ulong을 uint로 다시 코딩하면 속도를 높일 수도 있습니다.

저것들. 구현의 부정직함에 당황하지 않습니까(속도 측면에서 보면 훨씬 느릴 것입니다)? 알다시피.

추신: 부정직 - 확률이 다른 다양한 범위 숫자의 생성.
 
Vict :

저것들. 구현의 부정직함에 당황하지 않습니까(속도 측면에서 보면 훨씬 느릴 것입니다)? 알다시피.

추신: 부정직 - 확률이 다른 다양한 범위 숫자의 생성.
진심이야?
 
Why do people say there is modulo bias when using a random number generator?
Why do people say there is modulo bias when using a random number generator?
  • 2012.06.11
  • user1413793user1413793 5,32651933
  • stackoverflow.com
I have seen this question asked a lot but never seen a true concrete answer to it. So I am going to post one here which will hopefully help people understand why exactly there is "modulo bias" when using a random number generator, like in C++.
 
저것들. 침대 밑에 굴려진 10센트를 찾기 위해 100달러 지폐에 불을 붙일 준비가 되셨습니까?
 
Nikolai Semko :
저것들. 침대 밑에 굴려진 10센트를 찾기 위해 100달러 지폐에 불을 붙일 준비가 되셨습니까?

당신은 확률의 역할을 헛되이 과소평가하고 있습니다. 수백만 번의 반복에서 이러한 "주화"는 상당히 실질적인 숫자가 될 것입니다. 게다가, 당신의 코드는 작은 범위에 대해 분명히 비합리적입니다.

6개월 전에 이 주제는 이미 포럼에서 논의되었으며 다음 옵션을 제안했습니다.

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

N 번째 범위에서 난수를 얻는 방법은 무엇입니까?

알렉세이 나보이코프 , 2018.12.31 01:25

이전 코드가 잘못되었습니다. 순위에 너무 영리합니다. 다음은 올바른 버전이며 동시에 더 간결합니다.

 ulong RandomLong( ulong range)
{
 #define _MAXRND(range, rnd_range)  ((rnd_range) - ((rnd_range)-range)%range - 1 ) 
 #define _RND ( ulong ) rand ()
   ulong rnd, max, const bit= 1 ;
   if (range <= bit<< 15 ) { if (!range) return 0 ;  max=_MAXRND(range, 1 << 15 );   while ((rnd=_RND) > max);   return rnd%range; }
   if (range <= bit<< 30 ) { max=_MAXRND(range, bit<< 30 );   while ((rnd=(_RND | _RND<< 15 )) > max);   return rnd%range; }
   if (range <= bit<< 45 ) { max=_MAXRND(range, bit<< 45 );   while ((rnd=(_RND | _RND<< 15 | _RND<< 30 )) > max);   return rnd%range;  }
   if (range <= bit<< 60 ) { max=_MAXRND(range, bit<< 60 );   while ((rnd=(_RND | _RND<< 15 | _RND<< 30 | _RND<< 45 )) > max);   return rnd%range; }
                   else   { max=_MAXRND(range, bit<< 64 );   while ((rnd=(_RND | _RND<< 15 | _RND<< 30 | _RND<< 45 | _RND<< 60 )) > max);   return rnd%range; }
 #undef _RND               
 #undef _MAXRND
}
사유: