22/01/2019, 23:45
vict85 ha scritto:Due considerazioni aggiuntive:
- Gran parte dei dati che memorizzi e che calcoli non li usi per calcolare la reputazione finale degli utenti. Per capirci, questo codice è equivalente al tuo:
- Codice:
#include <array>
#include <iostream>
#include <fstream>
#include <cstdlib>
class Utente
{
public:
constexpr Utente() noexcept : m_reputazione{ 0.5f } {};
constexpr float reputazione() const { return m_reputazione; }
constexpr void aggiorna_repuntazione(float recensione, float reputazione_compratore) noexcept
{
const float factor = (reputazione_compratore < 0.5f)
? reputazione_compratore * reputazione_compratore * reputazione_compratore
: reputazione_compratore * reputazione_compratore;
m_reputazione = m_reputazione * (1 - factor) + factor * recensione;
}
constexpr bool imbroglia() noexcept { return m_reputazione < 0.5f; }
private:
float m_reputazione;
};
int main()
{
constexpr unsigned int NUMERO_UTENTI = 100;
std::array< Utente, NUMERO_UTENTI > utenti;
std::ifstream ifile("transaction1.dat", std::ios::in);
if (!ifile) {
std::cerr << "File transaction1.dat could not be opened" << std::endl;
exit(EXIT_FAILURE);
}
for (;;)
{
int mittente = 0, destinatario = 0;
float voto = 0.0f;
{
float valore_da_ignorare = 0.0f;
ifile >> mittente >> destinatario >> valore_da_ignorare >> voto;
}
if (!ifile)
{
ifile.close();
break;
}
if ( mittente == destinatario
|| mittente < 0 || mittente >= NUMERO_UTENTI
|| destinatario < 0 || destinatario >= NUMERO_UTENTI
|| voto < 0.0f || voto > 1.0f )
{
std::cerr << "Transazione invalida: "
<< mittente << " -> " << destinatario
<< " feed=" << voto << std::endl;
ifile.close();
exit(EXIT_FAILURE);
}
Utente& utente_mittente = utenti[mittente];
Utente& utente_destinatario = utenti[destinatario];
utente_destinatario.aggiorna_repuntazione(voto, utente_mittente.reputazione());
}
for (int i = 0; i != utenti.size( ); ++i)
{
if (utenti[i].imbroglia())
{
std::cout << i << std::endl;
}
}
}- Al fine di avere un risultato attendibile, ogni utente deve essere il destinatario di un numero sufficiente di transazioni. Di fatto stai usando un numero piuttosto basso di transazioni.
Skuola.net News è una testata giornalistica iscritta al Registro degli Operatori della Comunicazione.
Registrazione: n° 20792 del 23/12/2010.
©2000—
Skuola Network s.r.l. Tutti i diritti riservati. — P.I. 10404470014.
Powered by phpBB © phpBB Group - Privacy policy - Cookie privacy
phpBB Mobile / SEO by Artodia.