2016-11-24 80 views
0

我对这个站点(和一般编程)相对较新,所以如果这篇文章像最后一篇那样糟糕,请告诉我是否应该改变它,我会尽力做到这一点。C++尝试创建随机排列的密码阵列

因此,我给出了一个阵列密码中的50个密码数组,我面临的直接挑战是必须随机化他们的安排,随机数字发生器的帮助。出于某种原因,使用我所拥有的代码,我在某处犯了一些错误,导致代码被卡在循环中或其他东西中。我知道我接近正确,但我不知道我犯了什么错误。

我试着创建一个随机数,检查它是否已经在数组PasswordsTemp中声明,然后:(如果它已经在数组中,什么都不做),(如果它不在循环中,将它添加到下一个可用索引处的循环中)。为了然后选择另一个随机数,该代码必须循环。我将它设置为循环600次(实际上)确保它在某个时刻猜测每个数字0到50。在此之后,我只是编写了一个简单的cout来查看数组的外观。

任何帮助/意见,将不胜感激。请注意,我在这里比较新,所以也许试着对我稍微容易一些,或者只是帮助其他人代替对我进行指责。谢谢。

#include <iostream> 
#include <string> 
#include <fstream> 
#include <time.h> 

int main() 
{ 
std::string firstname = ""; 
std::string lastname = ""; 
std::string lastnametemp = ""; 
std::string fullname = ""; 
std::string Users[50] = {""}; 
std::string Passwords[50] = {""}; 
std::string NewPass = {""}; 
std::string temp = {""}; 
int PasswordsTemp[50] = {60}; 
int randomNumber = 0; 
bool repeat = false; 
int A = 0; 
int i = 0; 

std::ifstream inputHandler; 
inputHandler.open("names.txt"); 

while (!inputHandler.eof())//ignore this part. I know it works. 
{ 
    inputHandler >> firstname >> lastname; //reads first name and last name of one line 
    lastnametemp = lastname.substr(0, 7); // sets temp last name as being at most, 7 letters long 
    fullname = firstname[0] + lastnametemp; // combines the two into a full name 
    Users[i] = fullname; //creates Users array 
    i = i + 1;//indexes data 
} 


std::ifstream indata; 
indata.open("passwords.txt"); 
i = 0; 
    while (!indata.eof()) 
{ 
    indata >> Passwords[i];//reads in passwords into array called Passwords 
    i = i + 1; 
} 
    inputHandler.close(); 


    //******************************************************* 
    //****************Confusion hereafter******************** 
    //******************************************************* 


    for (i = 0; i < 600; i++)//Loops a long time to (practically) ensure that all numbers 0 to 50 are guessed atleast once 
    { 
     srand(time(NULL)); 
     randomNumber = rand() % 51;//Produces random number between 0 and 50 

     for (i = 0; i < 51; i++) 
     { 
      if (randomNumber == PasswordsTemp[i]) 
      { 
       repeat = true;//determines if the random number appears anywhere in the PasswordsTemp array; repeat = true if it appears anywhere 
      } 
     } 

     if (repeat == false)//if the random number doesn't appear anywhere, assign the random number an index in Passwordstemp 
     { 
      PasswordsTemp[A] = randomNumber; 
      A = A + 1; 
     } 
    } 
    //***************************************************************************** 
    //**************************End of Confusion*********************************** 
    //***************************************************************************** 
    for (A = 0; A < 51; A++)//Checks to see if the passwords are randomized 
    { 
     temp = Passwords[PasswordsTemp[A]]; 
     std::cout << temp << std::endl; 
    } 

return 0; 
} 
+0

'while(!inputHandler.eof())//忽略此部分。我知道它的工作原理。'[它不起作用。](http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-wrong) – user4581301

+0

既不'同时(!indata.eof())'出于同样的原因。 – user4581301

+0

@ user4581301我不知道该告诉你什么。使用我的文件names.txt,我完全可以读取两列文本,并将它们存储为变量的名字和姓氏。相信我,只是忽略那部分。我只在用星号表示的部分存在问题。 –

回答

0

我可以推荐一种不同的方法吗?正如你所说,由于你运行了600次,所以不能保证每个号码至少会被击中一次。相反,使用一个while循环,上面写着:虽然PasswordsTemp包含randomNumber,再次随机化randomNumber:

while(PasswordsTemp.contains(randomNumber) 
{ 
    randomNumber = rand() % 51; 
} 

然后继续在你的代码已经行:

PasswordsTemp[A] = randomNumber; 
A = A + 1; 

,并把所有的,在从0到PasswordsTemp长度结束的for循环。此外,PasswordsTemp的长度是50,而不是51,所以尝试访问PasswordsTemp [51]将返回错误。

-1

即不是容易的,但你可以存储50首的RNG口角并将其分类到您的列表映射到它...

要明白,这里的我的意思伪代码:

for(i=1..50) 
    a[i] <— rng 
end for 
for(i=1..50) 
    b[i] <— a[i] 
end for 

//not being easy 
b <— sort(b) 

for(i=1..50) 
    for(j=1..50) 
     if(b[i]==a[j]) shuffled_list[i] <— original_list[j] 
    end for 
end for 
+0

很难理解你写的内容。 – user4581301

0

一个简单的方法来制作你的随机密码的排列是:

  1. 创建包含0阵列,以50
  2. 申请std::random_shuffle or std::shuffle到数组。这将随机重新排列元素。

全部完成。

特别奖金编辑:

while (!inputHandler.eof())//ignore this part. I know it works. 
{ 
    inputHandler >> firstname >> lastname; //reads first name and last name of one line 
    lastnametemp = lastname.substr(0, 7); // sets temp last name as being at most, 7 letters long 
    fullname = firstname[0] + lastnametemp; // combines the two into a full name 
    Users[i] = fullname; //creates Users array 
    i = i + 1;//indexes data 
} 

不能工作。它在从文件读取数据之前测试EOF。直到尝试读取数据并失败后,才能确定是否已到达文件末尾。读取之前进行测试可确保您将读取文件末尾并使用未读垃圾。始终

  1. 读取数据
  2. 您阅读数据
  3. 使用数据或退出,这取决于2

测试,以便

while (inputHandler >> firstname >> lastname)// read and test 
{ 
    // now use 
    lastnametemp = lastname.substr(0, 7); // sets temp last name as being at most, 7 letters long 
    fullname = firstname[0] + lastnametemp; // combines the two into a full name 
    Users[i] = fullname; //creates Users array 
    i = i + 1;//indexes data 
} 

还建议,所以你不要限制器对Users[i]数组和using std::getline读取的数据太多,因此您可以使用“Victor Von Doom” 。

+0

大声笑,我真的很感谢你的帮助。我做。请相信我EOF DOES存储姓名/名字。这里有一些截图来向你展示。 http://imgur.com/a/4sBkk –

+0

@JohnGalt所有标记必须做的事情是让你的程序搞砸了,在输入的末尾输入空格。 [添加一个空白行,通常你会看到姓氏重复。](http://ideone.com/2O3qHQ)留下一个标记低挂水果,你会后悔,无论是在低年级或一种劣质教育。 – user4581301