У меня была небольшая проблема с моей программой, что я пытаюсь сделать, это разработать способ для пользователей имитировать возможные сильные стороны паролей. Это предполагает, что все пароли являются перестановками (это странно, я знаю, но я полагаю, что это означает, что данные становятся еще более громоздкими.) Используя уравнение...
//п!/(Пг)! когда n! = (e ^ -n) * (n ^ n) sqrt (2 (pi) n). Когда n - количество используемых символов, а r - длина пароля
Независимо от того, что я ставлю, я получаю nan в качестве ответа. Я думал, что, возможно, мое уравнение было выключено (возможно, каким-то образом я делясь на ноль), поэтому я переработал его и упростил его. Но это не похоже на проблему, хотя я чувствую, что это приблизило меня к правильности. Но у меня была мысль, что, возможно, числовое переполнение имеет эффект здесь? Но я действительно не знаю, как это исправить. Я пытался перескакивать с разных типов данных, но ничего не работало.
У меня также проблема с модулем. Он возвращает обратно числа меньше нуля за время, поэтому с моим знанием noobish, который говорит мне, что, может быть, я переполняю его снова, но как еще я буду использовать% без определения его как int? Может быть, исправление вышеуказанной проблемы сработает?
Я был бы благодарен за любую помощь, оказанную мне. Как можно заниматься обратными значениями nan? Существует ли пошаговое статус-кво для его решения? Это почти всегда переполнение или может быть что-то еще?
Сам код.
#include <iostream>
#include <cmath>
using namespace std;
const int SECONDS_IN_YEAR = 31556926;
const int SECONDS_IN_DAY = 86400;
const int SECONDS_IN_HOUR = 3600;
const int SECONDS_IN_MIN = 60;
int main()
{
int passwordLength ,characterSymbols;
double instructionsPerSecond, instructionSuccess;
////////////////////////////////////////////////////////////////////////////////
//Equations needed
// n!/(n-r)!
//n is the number of letters in the alphabet
//and r is the number of letters in the password
// n! = (e^-n)*(n^n) sqrt(2(pi)n)
double numeratorFactorial = (pow(M_E,-characterSymbols))
*(pow(characterSymbols,characterSymbols))
*(sqrt(2*M_PI*characterSymbols));
// (n-r)
double characterMinusLength= (characterSymbols-passwordLength);
// (n-r)! = (e^-(n-r)) * ((n-r)^(n-r)) * sqrt(2(pi)(n-r))
double denominatorFactorial = ((pow(M_E, -(characterMinusLength)))*
(pow((characterMinusLength),(characterMinusLength)))
* (sqrt(2*M_PI*(characterMinusLength))));
// n!/(n-r)!
long double passwordPermutation = (numeratorFactorial / denominatorFactorial);
// (passwords)* (instructions/Password) * (seconds/instruction) = sec
int passwordSeconds = (passwordPermutation * instructionSuccess)
*(1/instructionsPerSecond);
int passwordMin = passwordSeconds / SECONDS_IN_MIN ;
int passwordHour = passwordSeconds / SECONDS_IN_HOUR;
int passwordDay = passwordSeconds / SECONDS_IN_DAY ;
int passwordYear = passwordSeconds / SECONDS_IN_YEAR;
////////////////////////////////////////////////////////////////////////////////
//Explain purpose of program
cout << "This program is designed to simulate the strength of passwords." << endl;
//Ask for alphabet
cout << "But first, share with me the max number of characters you'd be using."
<< endl;
cin >> characterSymbols;
//Reflect information
cout << "We will be using " << characterSymbols << " character symbols to "
<< " construct the password.\n" << endl;
///////////////////////////////////////////////////////////////////////////////
//Input length of password
cout << "\n\nWill you give me the length of proposed password?" << endl;
cin >> passwordLength;
//Repeat information
cout << "The password length will be " << passwordLength << "." <<endl;
//cout permutations
cout << "This would lead to " << passwordPermutation << " unique password\n"
<< endl;
////////////////////////////////////////////////////////////////////////////////
//Ask for computer strength
cout << "How powerful is this computer? How many instructions per second " << endl;
cout << "can it accomplish?" << endl;
cin >> instructionsPerSecond;
//Read out computer strength
cout << "The computer can do " << instructionsPerSecond << " instructions/second"
<< endl << endl;
////////////////////////////////////////////////////////////////////////////////
//Ask for instructions/password
cout << "The number of instructions needed to test your password is." << endl
<< endl;
cin >> instructionSuccess;
//reflect
cout << "This computer can do " << instructionSuccess
<< " instructions/password" << endl;
////////////////////////////////////////////////////////////////////////////////
cout << "\n\nThe amount of seconds it'll take to crack this passcode is... "
<< endl << passwordSeconds << " seconds.\n\n\n\n\n" << endl;
////////////////////////////////////////////////////////////////////////////////
//Reflect all information in an easily readable table
cout << "Number of character symbols using... " << characterSymbols << endl;
cout << "Length of password... " << passwordLength << endl;
cout << "Number of permutations... " << passwordPermutation << endl;
cout << "Instructions per second... " << instructionsPerSecond << endl;
cout << "Instructions per password..." << instructionSuccess << endl;
cout << endl << endl << endl;
////////////////////////////////////////////////////////////////////////////////
//Add in conversions for min, hour, day, years
cout << "Number of seconds to break..." << passwordSeconds << endl;
cout << "Converted to minutes..." << passwordMin << endl;
passwordMin = passwordSeconds / SECONDS_IN_MIN;
passwordSeconds = passwordSeconds % SECONDS_IN_MIN;
cout << "Converted to hours..." << passwordHour << endl;
passwordHour = passwordSeconds / SECONDS_IN_HOUR;
passwordSeconds = passwordSeconds % SECONDS_IN_MIN;
cout << "Converted to days..." << passwordDay << endl;
passwordDay = passwordSeconds / SECONDS_IN_DAY;
passwordSeconds = passwordSeconds % SECONDS_IN_DAY;
cout << "Converted to years..." << passwordYear << endl;
passwordYear = passwordSeconds / SECONDS_IN_YEAR;
passwordSeconds = passwordSeconds % SECONDS_IN_YEAR;
return (0);
}
"nan" означает "не число". Это происходит потому, что вы указали переменные characterSymbols и passwordLength, не указав им начальное значение.
Вы должны инициализировать любую переменную, прежде чем использовать ее, - если вы этого не сделаете, вы будете иметь неопределенное поведение. Например:
int x;
int y;
int z = x + y;
Невозможно предсказать, что z будет здесь равным, потому что мы не знаем, что x или y равны. Точно так же ваш код должен выглядеть примерно так:
int characterSymbols = 10; //or whatever you want the initial value to be
...
double numeratorFactorial = (pow(M_E,-characterSymbols))
*(pow(characterSymbols,characterSymbols))
*(sqrt(2*M_PI*characterSymbols));
Таким образом, числительFactorial будет иметь действительное значение.
Кажется, вы думаете, что объявляете "уравнения", когда вы фактически объявляете переменные. Ты пишешь:
double numeratorFactorial = (pow(M_E,-characterSymbols))
*(pow(characterSymbols,characterSymbols))
*(sqrt(2*M_PI*characterSymbols));
Но characterSymbols
не определен, только "объявлен". characterSymbols
объявлен над ним, но он не имеет значения... пока. Позже вы используете cin
чтобы получить в нем значение, но когда вы сначала объявляете numeratorFactorial
вы не можете просто ожидать, что программа будет вставлять значение в numeratorFactorial
при изменении characterSymbols
.
Некоторые определения, вероятно, находятся в следующем порядке: оператор double numeratorFactorial = some_value;
создает переменную с именем numeratorFactorial
и использует some_value
для немедленного заполнения этой переменной. То, что вы хотите, - это функция, логическое выражение, в котором вы можете "передавать значения", чтобы значения генерировались, когда они вам понадобятся. Например, для факториала числителя:
double numeratorFactorial(double characterSymbols) {
return (pow(M_E,-characterSymbols))
*(pow(characterSymbols,characterSymbols))
*(sqrt(2*M_PI*characterSymbols));
}
int main() {
std::cout << "Numerator Factorial test: " << numeratorFactorial(5.0) << std::endl;
}
Обратите внимание: вы не можете объявить функцию в основной функции.
Такого рода вещи - основы программирования, и кажется, что вы пытаетесь бежать, прежде чем научитесь ходить. Получите хорошую книгу, как C++ Primer и пошагите себя.