MathRand()는 어떻게 값을 생성합니까?

 

MathRand() 가 값을 얻는 방법을 알려주세요.

MathRand()가 명시된 범위에 고르게 분포될 것으로 예상할 수 있습니까?

 

그것은 4차 포럼에서 여러 번 논의되었습니다. MathRand를 검색하면 15페이지 이상의 결과가 반환됩니다.

예를 들어 다음 주제:

https://www.mql5.com/ru/forum/123337

https://www.mql5.com/ru/forum/111855

https://www.mql5.com/ru/forum/111974

https://www.mql5.com/ru/forum/125667

Генерация равномерно распределенных случайных чисел (0,1) - MQL4 форум
  • www.mql5.com
Генерация равномерно распределенных случайных чисел (0,1) - MQL4 форум
 
유샤 :

MathRand()가 값을 얻는 방법을 알려주세요.

MathRand()가 명시된 범위에 고르게 분포될 것으로 예상할 수 있습니까?

제 생각에는 분포 테스트를 수행할 수 있지만 수행 방법이 기억나지 않습니다.

오래 전에 php로 확인했습니다.

난수가 많이 생성된 후 그래프가 생성되는 것 같습니다.

또는 예를 들어 대략적인 추정치를 위해 동일한 숫자의 수를 찾을 수 있습니다.

수백 개의 숫자를 생성하고 파일에 쓴 다음 최소한 Excel에서 그래프를 작성하십시오.

 

스트링고 ,

나는 읽기를 위해 제안 된 모든 링크를 마스터하지 않았습니다))

메시지의 수와 토론 참가자의 구성을 살펴보면서 다음과 같은 결론을 내렸습니다.

- MathRand()를 안전하게 사용할 수 있습니다.

- "해상도" 0..32767이 충분하지 않은 경우 MathRand()*MathRand()를 사용할 수 있습니다. - 분포가 한 방향 또는 다른 방향으로 강하게 "비뚤어지지" 않습니다.

미스터프로프 ,

대략적인 견적을 내기 쉽습니다

정수 A[32768] ;

for (int i=0; i<100000000; i++)

A[MathRand()]++;

하지만 왜?

내 목적을 위해 개발자의 의견으로 충분합니다.

 
유샤 :

내 목적을 위해 개발자의 의견으로 충분합니다.

개발자는 MathRand를 자체적으로 개발하지 않고 CRT 함수 srand 및 rand로 직접 호출 변환을 구현했습니다.

일반용으로 좋습니다.

 
그리고 "hoo"를 원하면 https://www.mql5.com/ru/forum/123337/page16 이 맨 아래 게시물입니다.
Генерация равномерно распределенных случайных чисел (0,1) - MQL4 форум
  • www.mql5.com
Генерация равномерно распределенных случайных чисел (0,1) - MQL4 форум
 
고무 :
그리고 "hoo"를 원하면 https://www.mql5.com/ru/forum/123337/page16 이 맨 아래 게시물입니다.

퍼지 논리 알고리즘에서 무작위로 가중치를 이동해야 합니다.

가장 중요한 것은 한 방향으로 일정한 "막힘"이 없다는 것입니다.

물론 "hoo"에 감사하지만 제 경우에는 중복됩니다))

 

계정에

" - "해상도" 0..32767이 충분하지 않은 경우 MathRand()*MathRand() 를 사용할 수 있습니다. - 분포가 한 방향 또는 다른 방향으로 강하게 "비뚤어지지" 않습니다. "

흥분했다...

기대치는 범위의 중간 왼쪽으로 이동합니다(1/4 * 32768^2 로 의심되지만 더 이상 확실하지 않음)

일반적으로 내 진술은 잘못되었습니다

 
유샤 :

계정에

" - "해상도" 0..32767이 충분하지 않은 경우 MathRand()*MathRand()를 사용할 수 있습니다. - 분포가 한 방향 또는 다른 방향으로 강하게 "비뚤어지지" 않습니다. "

흥분했다...

기대치는 범위의 중간 왼쪽으로 이동합니다(1/4 * 32768^2 로 의심되지만 더 이상 확실하지 않음)

일반적으로 내 진술은 잘못되었습니다

hmslo drange [0, (2^rstep)-1]

 long ranD( int rstep)
{
long div= 1 ;
long r= 0 ; 
   for ( int i= 1 ;i<=rstep;i++)
   {
   if ( MathRand ()+ 1 > 16383.5 ){ if (i== 1 ){r= 1 ;} else {r+=div;}}
   div=div* 2 ;
   }
return (r);
}

long 대신 int 또는 double 또는 ulong을 사용할 수 있습니다.

 

고무 ,

rstep [0, 2^rstep-1] - 이 매개변수가 무엇인지 이해하지 못했습니다.

문제:

이중 변수는 소수점 이하 8자리까지의 정확도로 무작위로 변경해야 합니다.

MathRand()/32768은 0.00003 단계를 제공합니다. 충분하지 않습니다.

MathRand()를 사용하여 이산도가 0.00000001인 (0..1) 임의 값에 균일하게 분포되는 방법은 무엇입니까?

 
유샤 :

고무 ,

rstep [0, 2^rstep-1] - 이 매개변수가 무엇인지 이해하지 못했습니다.

문제:

이중 변수는 소수점 이하 8자리까지의 정확도로 무작위로 변경해야 합니다.

MathRand()/32768은 0.00003 단계를 제공합니다. 충분하지 않습니다.

MathRand()를 사용하여 이산도가 0.00000001인 (0..1) 임의 값에 균일하게 분포되는 방법은 무엇입니까?


rsign=1(-1.1), rsign=0(0.1)

 double ranD( int rsign, int rstep)
{
double div= 2 ;
double r= 0 ; 
   for ( int i= 1 ;i<=rstep;i++)
   {
   if ( MathRand ()+ 1 > 16383.5 ){r+= 1 /div;}
   div=div* 2 ;   
   }
      if (rsign== 1 )
         {
         r= 2 *r- 1 ;
         }
return (r);
}

rstep은 정도

사유: