2014-10-03 2 views
0

안녕하세요 저는 여기에 초보자이며 여기에서 올바르게 휴식 할 수 있기를 희망합니다. 우리는 난수 발생기 처리 마지막 학기는 나와 내 친구 우리는 일 (아래) 간단한 프로그램을 마련 할 수 있었다 : Main.cpp 및 난수 생성기 C++

using namespace std; 

int randomG() { 
    int GER(0); 
    GER=rand(); 
    GER %= 10; 
    GER++; 
    return(GER); 
} 

int main() { 
    srand((unsigned)time(NULL)); 
    for(int i = 0; i != 100; i++) { 
     cout << randomG(); 
    } 
} 

이제 우리는 그것으로 많이 이동하지 않고이 주어있어 이번 학기. 기본적으로 그는 우리에게 FNC 함수를 여러 번 호출하는 main.cpp로 난수 생성기를 구현하기 위해 프로그램을 테스트하기 위해 state = 1을 초기 값으로 사용해야합니다. 주 프로그램에서 FNC에 전화하십시오. 10000 개 통화 후 : 상태가 399,268,537 같아야한다 아래

우리의 출발점이 될 것입니다 (그가 여기 무슨 뜻인지하지 않음) :

우리가 완전히 무엇을해야하는지에 손실 MAIN.CPP에 대한
double rand (void) { 
    const long a=48271   //multiplier 
    const long b=2147483647  //modulus 
    const long c=b/a    //questient 
    const long r=b % a   //remainder 
    static long state =1; 
    long t = a* (state % c) - r * (state/c); 
    if(t >0) 
     state=t; 
    else 
     state = t+b; 
    return ((double) state/b); 
} 

, 우리 우리가 어떻게 함수 을 호출하고 처음 1-10 통화 및 9991-10000 FNG 호출에 대해 프로그램 출력에서 ​​테이블을 만들지에 대해서는 잘 모른다. 우리는 더 이상 움직일 수 없다. 우리와 같은 2 학년의 경우 이것은 완전히 혼란입니다. 모든 도움을 주실 수 있습니다

아래에서 도와주세요. 내 코드는 아래에 있습니다. 그러나 아직도 여기에 실종 된 내용이 없습니다.

#include "stdafx.h" 
#include <iostream> 
#include <vector> 

using namespace std; 

double seed(long state) { 
    g_state = state; 
} 

double rand(void) { 
    const long a = 48271; 
    const long b = 2147483647; 
    const long c = b/a; 
    const long r = b % a; 
    long t = a* (g_state % c) - r * (g_state/c); 
    if (t > 0) 
     g_state = t; 
    else 
     g_state = t + b; 
    return ((double)g_state/b); 
} 


int main() { 
    std::vector<double> results; 
    for (int i = 1; i <= 10000; ++i) { 
     double number = rand(); 
    if (i <= 10 || i >= 9991) 
     results.push_back(number); 
} 
+0

는 다시 교수로 돌아가서 그의 도전은 아무 의미 말해. –

+0

당신은 당신이 생각하는 것을 말하지 않고 "FNC"와 "FNG"를 던지고 있습니다 ... 내게 아무 의미도 없습니다. 어쩌면 강의 노트 나 교과서를 확인해도 될까요? 어쨌든 "rand"함수가 "FNC"함수 일 경우, 요청한 것은 std :: vector 결과입니다. for (int i = 1; i <= 10000; ++ i) {double sample = rand(); if (i <= 10 or i > = 9991) results.push_back (sample); }. (벡터는 실제로 테이블입니다.) –

+0

예 FNC는 단지 이름입니다 : "rand"함수라고 가정하십시오. [FNG가 오타되었습니다] 입력 해 주셔서 감사합니다. 지금 제게 의미가 있습니다. –

답변

1

state은 여기에 귀하의 종자입니다. 10000 호출 후 399268537이됩니다. 그는 당신에게 당신의 구현을 확인하는 가치를주었습니다.

int main() 
{ 
    for(int i = 0; i < 10000; ++i) 
    { 
     rand(); 
    } 
} 

다시 표정이 후 rand()를 호출하고 함수에 단계로 state의 값을 선택하면 당신은 그것의 볼 399268537.

귀하의 코드가 나를 훨씬 더 보이도록로 리팩토링 할 수

같은 srand()rand() :

double seed(long state) 
{ 
    g_state = state; 
} 

double rand(void) 
{ 
    const long a = 48271;    
    const long b = 2147483647;  
    const long c = b/a;   
    const long r = b % a;   
    long t = a* (g_state % c) - r * (g_state/c); 
    if(t > 0) 
     g_state = t; 
    else 
     g_state = t + b; 
    return ((double)g_state/b); 
} 

int main() 
{ 
    seed(1); 
    for(int i = 0; i < 10000; ++i) 
    { 
     rand(); 
    } 
} 
+0

내 혼란에 정말 그늘을 드리겠습니다. 너 같은 사람들은 재미있는 학습을한다. 나는 문제를 재 작업하고 내가 생각해내는 것을보기 위해 노력하고있다. 고마워. V.내 대답은 –

+0

입니다. 아직 컴파일되지 않은 코드입니다. #include #include using namespace std; 더블 시드 (long 상태) { \t S_state = state; } double rand (void) { \t const long a = 48271; \t const long b = 2147483647; \t const long c = b/a; \t const long r = b % a; \t long t = a * (S_state % c) - r * (S_state/c); \t if (t> 0) \t \t S_state = t; \t else \t \t S_state = t + b; \t return ((double) S_state/b); } int main() { \t std :: vector 결과; \t for (int i = 1; i <= 10000; ++ i) \t {double sample = rand(); \t if (i <= 10 || i > = 9991) results.push_back (sample); \t} –