2017-12-01 20 views
1

MAX_SIZEの数値を0から9まで生成し、ランダムというベクトルに格納して、同じ桁が2回表示されないようにしました、最大値は10桁です。 コードは動作しているようですが、まれに(または繰り返して開くと)誰かが閉じられるまで作業やロックを停止するようです。 これは乱数の生成と関係がありますが、わかりませんが、私はまだ学習しています。 これは完全なコードは次のとおりです。実行時に乱数リストのジェネレータが動作しない

#include <iostream> 
#include <vector> 
#include <string> 
#include <algorithm> 
#include <cmath> 
#include <ctime> 
using namespace std; 

vector<int> random; 
constexpr int MAX_SIZE = 10; //can be up to 10, try and change it over the limit 

int generate() { //generates a casual number between 0 and 9 
    int a = 0; 
    a = rand() % 10; 
    return a; 
} 

int rand_elem(int a) { //makes sure the arg "int a" is not already contained in the vector<int> random 
    for (unsigned o = 0; o<MAX_SIZE; ++o) 
     if (a==random[o]) { 
      return 1; 
      break; //returns 1 and interrupts the check if there is a match (aka if there is already that number in the vetcor<int> random 
     } 
    return 0; //else returns 0 aka success 
} 

void random_fill() { //"fills" vector<int> random with different random numbers from 0 to 9 
    for (unsigned i = 0; i<MAX_SIZE;) { 
     int num = generate(); 
     if (i==0 || rand_elem(num)==0) { //checks if the newly generated number with generate() doesn't already belong to vector<int> random 
      random.push_back(num); 
      ++i; //if int num doesn't belong to vector<int> random, it is being added to it and the loop can proceed (++i) until the condition i<4 is met 
     } 
    } 
} 

int main() 
try { 
    if (MAX_SIZE > 10) { 
     throw (runtime_error("MAX_SIZE too big\n")); 
    } 
    srand(time(NULL)); //generates a seed for the random number generator generate() using system time 
    random_fill(); 
    for (unsigned h = 0; h<random.size(); ++h) //prints the content of the vector 
     cout<< random[h] << '\t'; 
} catch (runtime_error& e) { //error catching 
    cout <<"runtime error: "<< e.what()<<'\n'; 
    return 1; 
} 

希望これは質問のように、あまりにも冗長いないようですが、私は、サイト上で検索してすべての答えを見つけることができます。 ありがとうございます。

答えて

1

コードを以下のように再編成することをお勧めします。このループには一般的な問題があります:

for (unsigned o = 0; o<MAX_SIZE; ++o) 

ベクトルのサイズはMAX_SIZEではありません。実際には、サイズはベクトルに入れられるすべての数値で変化します。

#include <iostream> 
#include <vector> 
#include <string> 
#include <algorithm> 
#include <cmath> 
#include <ctime> 

using namespace std; 

vector<int> numbers; 

/** 
* Can be up to 10, try and change it over the limit. 
*/ 
const int MAX_SIZE = 10; 

/** 
* Generates a casual number between 0 and 9. 
*/ 
int generate() { 
    return rand() % 10; 
} 

/** 
* Makes sure the arg "int a" is not already contained in the vector<int> random. 
*/ 
bool rand_elem(int a) { 
    /* 
    * When vector is empty there is no way to has duplications. 
    */ 
    if(numbers.size() == 0) { 
     return false; 
    } 

    /* 
    * Check previous elements for duplications. 
    */ 
    for (int o = 0; o<numbers.size(); ++o) { 
     if (a == numbers[o]) { 
      /* 
      * Returns 1 and interrupts the check if there is a match (aka if there is already that number in the vetcor<int> random. 
      */ 
      return true; 
     } 
    } 

    /* 
    * Else returns 0 aka success. 
    */ 
    return false; 
} 

/** 
* Fills vector<int> random with different random numbers from 0 to 9. 
*/ 
void random_fill() { 
    int num; 
    for (unsigned i = 0; i<MAX_SIZE; i++) { 
     do { 
      num = generate(); 

      /* 
      * Checks if the newly generated number with generate() doesn't already belong to vector<int> random. 
      */ 
     } while(rand_elem(num) == true); 

     numbers.push_back(num); 
    } 
} 

/** 
* Program single entry point. 
*/ 
int main() { 
    /* 
    * Generates a seed for the random number generator generate() using system time. 
    */ 
    srand(time(NULL)); 

    try { 
     if (MAX_SIZE > 10) { 
      throw (runtime_error("MAX_SIZE too big\n")); 
     } 

     random_fill(); 

     /* 
     * Prints the content of the vector. 
     */ 
     for (int h = 0; h<numbers.size(); ++h) { 
      cout<< numbers[h] << '\t'; 
     } 

     /* 
     * Error catching. 
     */ 
    } catch (runtime_error& e) { 
     cout <<"runtime error: "<< e.what()<<'\n'; 
     return 1; 
    } 

    return EXIT_SUCCESS; 
} 
関連する問題