Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    [c++] problema generazione primi random

    Salve a tutti. Sto provando a generare un numero random primo minore di 1000 ma nel codice c'è qualcosa che non va e, essendo alle prime armi, non riesco a capirlo...Il codice dovrebbe stampare a video il valore A (che dovrebbe essere un intero compreso minore di 1000) ma inspiegabilmente ritorna sempre 4196208. Potreste aiutarmi? :-(

    codice:
    #include<ctime>
    #include<cstdlib>
    #include<iostream>
    using namespace std;
    
    bool isPrime(int);
    
    	
    int main() 
    {    
         int A;
         bool value = false;
         srand((unsigned)time(NULL));
          
    	while(value){
    	A = rand() % 1000; 
            if(isPrime(A)) 
    	value = true;
    	else value = false;
        	}
          cout << A << endl;
    
         return 0; 
    }
    
    
    bool isPrime(int x)
    {
            int max = static_cast <int> (x); /* Cast it to remove warnings */
            if (x <= 0 || x == 1 || (x % 2 == 0 && x != 2)) return false;
            for (int i = 3; i < max; i += 2)
                if (x % i == 0)
                    return false;
            return true;
    }

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    La variabile booleana "value" è inizializzata a false, pertanto il ciclo while() non verrà eseguito nemmeno una volta. Il valore di A che ti viene stampato, quindi, non è nient'altro che il valore "casuale" che contiene la variabile al momento della dichiarazione, dato che non l'hai inizializzata in alcun modo.
    Inizializza quindi "value" a true per entrare nel ciclo almeno una volta e rivediti la logica del ciclo perché, così com'è scritto (apportata la correzione di cui ti dicevo), ne usciresti al primo numero *non* primo generato.
    every day above ground is a good one

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    707
    Imprecisioni varie a parte, io direi che il ciclo ha una sua logica, basta solo che correggi:
    while(value)
    con
    while(!value)
    così il ciclo si interrompe al primo numero primo trovato, che è quello che volevi.

    Se poi cambi nome alla variabile da "value" a "found" assume il tutto una leggibilità maggiore.
    Magari semplifica anche mettendo direttamente:
    found = isPrime(A);

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    O meglio ancora:

    codice:
    do {
        A = rand()%1000; 
    } while (!isPrime(A));
    every day above ground is a good one

  5. #5
    Se devi generare più di qualche decina di numeri, ad occhio mi parrebbe più efficiente prima generare tutti i numeri primi minori di 1000 e metterli in un array, quindi pescare a caso elementi dall'aray in questione.
    Amaro C++, il gusto pieno dell'undefined behavior.

  6. #6
    Grazie mille!Adesso funziona :-)

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.