我是编程和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
答案 0 :(得分:2)
您的基本问题是随机数生成并不能保证唯一性。它当然不能保证程序运行之间的唯一性(例如,如果您想在程序的多次运行期间修改数据库,并保持一致性)。因此,您需要一种生成一组唯一ID的方法,删除之前使用过的任何ID(例如,在数据库中表示),然后随机播放剩余的内容。
可能有一种方法;
std::generate()
和一个适当的生成器来完成,每次调用它时都会返回一个不同的值。生成唯一ID的方法需要保持一致(无随机性)才能使第二步工作。std::shuffle()
。你会
需要阅读随机数生成。在C ++ 14之前,你
可能会使用std::random_shuffle()
,但请记住它使用rand()
生成随机值,其质量不确定 -
这就是它在C ++ 14中被弃用的原因(标记为未来
从标准中删除。)答案 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
}
}
}