将随机整数写入文本文件而不重复

时间:2017-10-14 20:09:23

标签: c++ file random duplicates output

我是编程和Stack Overflow的新手。所以我一直在构建一个简单的数据库,供我自己享受并练习我的知识。它注册用户的用户名,密码并分配用户ID。对于文本文件,您还可以查看用户的信息。

我的主要问题是我希望程序为用户分配一个随机的ID,例如1-1000(例如1000是最大雇员)。

当用户注册新的用户名和密码时,会执行此代码块。程序输出此部分中的用户名,密码和用户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

2 个答案:

答案 0 :(得分:2)

您的基本问题是随机数生成并不能保证唯一性。它当然不能保证程序运行之间的唯一性(例如,如果您想在程序的多次运行期间修改数据库,并保持一致性)。因此,您需要一种生成一组唯一ID的方法,删除之前使用过的任何ID(例如,在数据库中表示),然后随机播放剩余的内容。

可能有一种方法;

  1. 创建1000个(或您需要的任何数字)唯一ID的列表(例如,在向量中)。这可以通过一个简单的循环来完成,或者使用std::generate()和一个适当的生成器来完成,每次调用它时都会返回一个不同的值。生成唯一ID的方法需要保持一致(无随机性)才能使第二步工作。
  2. 读取数据库并删除数据库中的每个ID 清单。
  3. 如果剩余列表中的元素为零,则不允许添加更多元素 用户。
  4. 随机播放清单。在C ++ 11或更高版本中,使用std::shuffle()。你会 需要阅读随机数生成。在C ++ 14之前,你 可能会使用std::random_shuffle(),但请记住它使用rand() 生成随机值,其质量不确定 - 这就是它在C ++ 14中被弃用的原因(标记为未来 从标准中删除。)
  5. 每次需要新的唯一值时(例如,在创建用户时) 从列表中获取最后一个值,从中删除该值 列表,创建用户,并将其保存到数据库中。

答案 1 :(得分:1)

要做到这一点有一个棘手的问题:假设你想要随机生成10个值作为排列,并且你想将它们存储在一个文件中。

因此,您可以计算如何生成随机索引,然后使用值数组上的索引来存储数据:

有一天,当我开发一张卡片游戏时,我也会遇到同样的问题。每张卡片的图像都会使隐藏的图像无法随机跳转到某些位置。

#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
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,
  • 我只提供了一个小例子,所以在你的情况下,如果你想要1000个唯一值,只需将0-1000看作一个唯一值数组,这样你就可以使用上面的算法:

    1// initializing
    int randValues[1000];
    for(int i(0); i < 1000; i++)
        randValues[i] = (rand() % 1000) + 1; // because you want to discard 0
    

    现在获得唯一值:

    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
            }
        }
    }