2017-10-14 7 views
3

프로그래밍에 익숙하지 않고 스택 오버플로입니다. 따라서 필자는 자신 만의 즐거움과 지식을 얻기 위해 간단한 데이터베이스를 구축했습니다. 사용자의 사용자 이름, 암호를 등록하고 사용자 ID를 할당합니다. 텍스트 파일로 사용자의 정보를 볼 수도 있습니다.반복하지 않고 텍스트 파일에 임의의 정수 쓰기

내 주된 문제는 프로그램이 사용자에게 1-1000 (예 : 최대 직원 수 1000)의 무작위 ID를 할당하도록하려는 것입니다.

이 코드 블록은 사용자가 새 사용자 이름과 암호를 등록 할 때 실행됩니다. 프로그램은이 부분에서 사용자 이름, 암호 및 사용자 ID를 출력합니다. 만든 각 사용자에 대해 임의의 숫자를 출력하도록 프로그램을 가져올 수 있지만 중복이없는 숫자를 생성 할 수는 없습니다.

사용할 수있는 사용자 ID가 더 이상 없으면 등록 프로세스가 완료되지 않는다는 메시지가 프로그램에 출력되어야합니다.

줄을 정리하여 화면을 지우는 기능을 만들었지 만 모든 것이 맨 아래에 있습니다. 내가 사용할 수있는 다른 기능이 있다면 기꺼이 알게 될 것입니다! 의 당신이 무작위 순열로 생성 된 열 개 값을 원하는 당신이 파일에 저장하고 싶은 말은하자

if (passwordCheck == password) { 
      const int minEmp = 1, maxEmp = 10;   
      srand(time(0)); 
      userID = (rand() % (maxEmp - minEmp + 1)) + minEmp; 

      ofstream outfile (username + ".txt"); //Creates txt file with user name 
      outfile << "User ID: " << userID << endl << //Outputs info to txt file 
       "Account Username: "<< username << endl 
       << "Account Password: " << password; 
      outfile.close(); 
      clearScreen(); //My function to add lines to clear the screen 

      cout << endl << "Your account has been created." << endl 
       << endl << "Returning to main menu."; 

      clearScreen(); 
      mainMenu(); //Function to return back to menu 
+0

각 사용자마다 고유 한 난수를 생성 하시겠습니까? –

+3

"_ 내 주요한 문제는 프로그램이 사용자에게 1-1000_에서 무작위로 ID를 할당하기를 원합니다."그리고 .. 여기서 문제가 어디 있습니까? 해당 범위에서 고유 한 ID를 생성하려면 가장 쉬운 해결책은 사용 된 모든 ID를 기억/읽은 다음 "사용 된 ID"목록에없는 ID를 생성 할 때까지 ID를 생성하는 것입니다. 너 그거 해봤 니? –

+5

'srand'는 한 번만 호출해야합니다. 그리고 왜 '1'에서 시작하여 단순히 증분하는 ID를 할당 할 수 없습니까? – rustyx

답변

2

기본 문제는 난수 생성이 고유성을 보장하지 않는다는 것입니다. 프로그램 실행 사이의 고유성을 보장하지는 않습니다 (예 : 프로그램을 여러 번 실행하는 동안 데이터베이스를 수정하고 일관성을 유지하려는 경우). 따라서 고유 ID 세트를 생성하고 이전에 사용 된 (예 : 데이터베이스에 표시되어있는) ID를 제거한 다음 남은 항목을 임의로 섞어 놓는 방법이 필요합니다.

한 가지 방법이 있습니다.

  1. 고유 한 ID (예 : 벡터) 1000 개 목록을 만듭니다. 이 작업은 간단한 루프를 사용하거나 std::generate()을 호출 할 때마다 다른 값을 반환하는 적절한 생성기를 사용하여 수행 할 수 있습니다. 고유 한 ID를} 성하는 f}은 두 x 째 단계가 작동하도록 일관성이 있어야합니다 (무작위가 없음).
  2. 데이터베이스를 읽고 데이터베이스에있는 모든 ID를 목록에서 제거하십시오.
  3. 나머지 목록에 요소가없는 경우 사용자를 더 이상 추가 할 수 없습니다.
  4. 목록을 임의로 만듭니다. C++ 11 이상에서는 std::shuffle()을 사용하십시오. 은 임의 번호 생성을 읽어야합니다. C++ 14 이전에 은 std::random_shuffle()을 사용했지만, 임의 값을 생성하려면 rand() 을 사용하고 그 품질은 불확실합니다 ( ). 이는 C++ 14에서 향후 제공되지 않을 예정입니다 (향후 플래그로 표시됨). 표준에서 제거).
  5. 목록에서 마지막 값을 가져와 목록에서 해당 값을 제거하고 사용자를 생성 한 다음 데이터베이스에 저장하여 새 고유 값 (예 : 사용자를 만들 때)이 필요할 때마다.
+0

정확히 내가 찾고 있었던 벡터입니다. 나는 아직 그들에 대해 들어 보지 못했지만 대답 이후로 그들에 관해 읽었으며 가능한 한 빨리 내 프로그램에 적용하려고 노력했습니다. 고마워요! –

1

그 얻을 수있는 까다로운 일이 있습니다.

그래서 당신은 임의의 인덱스를 생성하는 데이터를 저장하는 값의 배열에 인덱스를 사용하는 방법을 계산할 수 있습니다

나는 이미지로 카드 게임을 개발할 때 나는 또한 일일 일부 같은 문제에 직면

그 각 실패는 숨겨진 이미지가 임의의 위치로 무작위로 점프.

#include <iostream> 
#include <fstream> 
#include <ctime> 


int main(){ 

    srand(time(NULL)); 

    std::ofstream out("data.txt"); 

    // arrays of data whose values will be stored randomly in a text file. 
    int array[10] = {7, 57, 23, 21, 1, 
        0, 18, 19, 3, 777}; 

    // array of indexes and initializing it 
    int indexes[10]; 
    for(int i(0); i < 10; i++) 
     indexes[i] = rand() % 10; 

    // indexes are filled with random values from 0 to 9 but it surely contains duplicates eg: 

    // 3, 0, 7, 5, 2, 8, 0, 1, 0, 0 


    // Now I use my algorithm to discard duplicates and repeating until I get an array of unique indexes. 

    for(int i = 0; i < 10; i++){ 
     for(int j(0); j < 10; j++){ 
      if(indexes[i] == indexes[j] && i != j){ 
       indexes[j] = rand() % 10; 
       i = 0; 
      }   
     } 
    } 

    // check out that the indexes are unique and no duplicates there: 

    std::cout << "\n\nThe random indexes: " << std::endl; 

    for(int i = 0; i < 10; i++) 
     std::cout << indexes[i] << ", "; 

    // writing the random values of array using the random indexes array to the file: 

    for(int i = 0; i < 10; i++) 
     out << array[indexes[i]] << ", "; 

    // printing the random values of the array 
    std::cout << "\n\nThe random values: " << std::endl; 

    for(int i = 0; i < 10; i++) 
     std::cout << array[indexes[i]] << ", "; 

    out.close(); 

    std::cout << std::endl << std::endl << std::endl; 
    return 0; 
} 

결과 : 프로그램을 여러 번 실행하고 결과를 확인하십시오.

1// initializing 
int randValues[1000]; 
for(int i(0); i < 1000; i++) 
    randValues[i] = (rand() % 1000) + 1; // because you want to discard 0 
: 당신이 위의 알고리즘을 사용할 수 있도록 단지 고유 한 값의 배열로 0-1000 보면 1000 개 고유 한 값을 원하는 경우 귀하의 경우 있도록

// 1 
The random indexes: 
3, 9, 5, 1, 7, 6, 0, 4, 8, 2, 

The random values: 
21, 777, 0, 57, 19, 18, 7, 1, 3, 23, 

// 2 
The random indexes: 
5, 8, 0, 1, 3, 9, 4, 2, 6, 7, 

The random values: 
0, 3, 7, 57, 21, 777, 1, 23, 18, 19, 


// 3 
The random indexes: 
6, 7, 3, 1, 5, 2, 4, 9, 0, 8, 

The random values: 
18, 19, 21, 57, 0, 23, 1, 777, 7, 3, 
  • 나는 단지 작은 예제를 제공

    지금 얻을 고유 값 :

    for(int i(0); i < 1000; i++){ 
        for(int j(0); j < 1000; j++){ 
         if(randValues[i] == randValues[j] && i != j){ 
          randValues[j] = (rand() % 1000) + 1; 
          i = 0; // reset 
         } 
        } 
    }