2013-07-22 5 views
0

예를 들어 0에서 1 사이의 임의의 숫자 목록을 생성 할 수 있지만 0.8에서 avarage를 가질 수 있습니까?임의의 숫자 만들기 특정 값으로 조정/평균

저는이 작은 스크립트를 C++로 작성했습니다.이 작은 스크립트는 출력 된 숫자를 알려줍니다. 이 질문은 실제로 C++과 관련이 없습니다.

#include <iostream> 
#include <random> 
#include <time.h> 
int main(int argCount, char** argVector) { 
    std::cout << "Generating Randoms" << std::endl; 

    float avarage = 0.F; 
    srand(rand() + (int) time(NULL)); 
    float ceiling = 0; 
    float bottom = 1; 
    for(unsigned int i = 0; i < 1000000; i++) { 
     float random = (float) (rand() % 101)/100; 
     if(random > ceiling) 
      ceiling = random; 
     else if(random < bottom) 
      bottom = random; 
     avarage += random; 
    } 
    std::cout << "Avarage: " << avarage/1000000 << std::endl; 
    std::cout << "Ceiling: " << ceiling << std::endl; 
    std::cout << "Bottom: " << bottom << std::endl; 
    return 0; 
} 

이 출력 :

Generating Randoms 
Avarage: 0.499287 
Ceiling: 1 
Bottom: 0 

내가 천장과 바닥을 싶습니다 여전히 0과 1 수 있지만 평균을 변경할 수 있습니다. 알고리즘은 또한 효율적이어야한다.

다시 한 번 나는 C++ 코드를 게시하고 있지만 모든 언어가이를 수행합니다.

+1

원하는 배포본이 있습니까? 'mu'를 설정하려면 많은 선택이 있습니다. 예 : http://en.wikipedia.org/wiki/Normal_distribution. 또는 아마도 균일 한 분포, 또는 베타 또는 – seth

+0

글쎄, 평균이 0 인 경우.5처럼, 지금은 모든 숫자가 0.5로 선택 될만큼 많은 기회를 갖기를 바랍니다. 0.7 인 경우, 0.7에 가까워 질수록 더 많은 기회를 얻고 평균 결과는 0.7이됩니다. 그래서 그것은 위키 페이지가 아닙니다. –

+0

이해할 수 있는지 잘 모르겠습니다. 평균이 0.5 일 때 균일 한 분포를 원하지만, 평균이 0.5와 다를 경우 비 균일 분포를 원하십니까? 0.7에 가까운 숫자의 '확률'을 지정해야합니다. 정규 분포 예제에서는 기본적으로 분산 매개 변수입니다. – seth

답변

3

NolanPower는 파워를 사용하는 것이 좋았지 만 전원을 선택하기 위해 추천 한 메커니즘은 꺼져 있습니다. 임의의 숫자 U이 균일하면 (0,1) law of the unconscious statisticiang(U)의 함수의 예상 값을 Integral[g(U) from: 0 to: 1]으로 유도 할 수 있다고 말합니다. 함수 g(U)이 다항식 인 경우, 어떤 상수 c에 대해 U**c 인 경우, 적분을 평가하면 일반적인 해결책 1/(c + 1)이 예상 값이됩니다. 이것을 원하는 평균값 인 m과 동일하게 설정하면 해결됩니다. c = (1/m) - 1입니다.

예상 값 0.8을 얻으려면 c = (1/0.8) - 1 = 0.25, 즉 U**0.25을 크랭크 아웃하십시오. 예상 값 0.2를 얻으려면 c = (1/0.2) - 1 = 4, 즉 U**4을 사용하여 값을 생성하십시오.

+1

나를 똑똑하게 만들어 주셔서 감사합니다. – NolanPower

+1

@NolanPower 이봐, 너 똑똑해. 기본적인 접근 방식은 매우 영리했습니다. 단지 배포판이 직관력이 없다는 것입니다. – pjs

1

숫자를 .321928로 올리면 평균 0.8이되며 여전히 0-1의 범위가됩니다.

+0

번호를 어떻게 계산합니까? –

+0

log (.8)/log (.5) – NolanPower

+0

많은 부정확성이 있습니다. (예 : 0.2를 가리킬 때 평균 0.3) –

0

여기서 표준 정규 분포를 생성하는 예, 즉 mu = 0 = 1

sigma 내가 Box-Muller transform 사용이다.

모든 플롯은 x axis = valuey axis = frequency입니다.

standardnorm

>>> np.std(nums) 
1.0004139708929858 
>>> np.average(nums) 
7.1785002756408726e-05 

당신은 전환 할 수 있습니다

#include <iostream> 
#include <random> 
#include <time.h> 
#include <math.h> 
int main(int argCount, char** argVector) { 
    const double pi = 3.14159265359; 
    const double nums = 1000000; 
    double u, v, x; 

    srand(rand() + (int) time(NULL)); 

    for(unsigned int i = 0; i < nums; i++){ 
     u = rand()/(((double)RAND_MAX) + 1.0); 
     v = rand()/(((double)RAND_MAX) + 1.0); 
     x = sqrt(-2*log(u)) * cos(2*pi*v); 

     if (std::isfinite(x)){ 
      std::cout << x <<" "; 
     } 
    } 

    return 0; 
} 

/규모 x 필요는 mu와 사용자가 선택한 sigma을 얻었다.

#include <iostream> 
#include <random> 
#include <time.h> 
#include <math.h> 
int main(int argCount, char** argVector) { 
    const double pi = 3.14159265359; 
    const double nums = 1000000; 
    double x,mu; 

    srand(rand() + (int) time(NULL)); 
    mu = 3.0; 

    for(unsigned int i = 0; i < nums; i++){ 
     x = rand()/(((double)RAND_MAX) + 1.0); 
     x *= 2*mu; 

     if (std::isfinite(x)){ 
      std::cout << x <<" "; 
     } 
    } 

    return 0; 
} 

unif

>>> np.average(nums) 
3.0003091558133184 

사용할 수있는 documentedrand() % range + min가 절단하기 :

여기에 주어진 mu와 균일 한 분포를주는 예입니다.