Visualizzazione dei risultati da 1 a 3 su 3

Discussione: jni e numeri random

  1. #1

    jni e numeri random

    ciao a tutti,

    ho un problema con codice nativo che genera numeri casuali.
    Il codice è
    codice:
    void genera_pesi() {
        register int i, j;
    
        srand((int) time(NULL));
        /*
        La funzione RAND restituisce un intero pseudocasuale compreso tra 0 e
        RAND_MAX, quindi i pesi e le soglie avranno valori compresi tra 0 e 1.
         */
        for (i = 0; i <= num_input; i++)
            for (j = 0; j < numhidden; j++)
                IH[i][j] = ((double) rand() / RAND_MAX) - 0.5;
    
    }
    Se lancio questo codice come codice c, quindi senza richiamarlo da JNI, la matrice IH contiene valori del tipo
    0.308321108 -0.125806253 -0.411981833 -0.381148894 0.382237635 0.480618824 -0.165709595 0.343524709 -0.401446707 0.096489133 -0.530874702

    Se lancio lo stesso codice tramite JNI, IH ha valori del tipo
    -0.499990177 -0.499993206 -0.499991434 -0.499994745 -0.499999661 -0.499997807 -0.499998376 -0.499994515 -0.499995277 -0.499993359 -0.499995098 -0.499987777 -0.499989834 -0.499992339

    In entrambi i casi RAND_MAX è pari a 0x7FFFFFFF, ovvero 2147483647 ma, nel caso di codice nativo, rand() non sembra fornire lo valori nello stesso intervallo.
    Avete già incontrato questo problema? Sapete spiegarmi cosa c'è che non va e come risolverlo?

    grazie a tutti!!

  2. #2

    Re: jni e numeri random

    ho risolto dividendo per 32767 e non per RAND_MAX ma vorrei capire perché chiamando da java rand() genera numeri tra 0 e 32767

  3. #3
    ho visto che nella libreria
    stdlib.h c'è scritto
    codice:
    #define RAND_MAX __RAND_MAX
    La macro _RAND_MAX è definita in config.h e c'è scritto
    codice:
    /* This block should be kept in sync with GCC's limits.h.  The point
       of having these definitions here is to not include limits.h, which
       would pollute the user namespace, while still using types of the
       the correct widths when deciding how to define __int32_t and
       __int64_t.  */
    #ifndef __INT_MAX__
    # ifdef INT_MAX
    #  define __INT_MAX__ INT_MAX
    # else
    #  define __INT_MAX__ 2147483647
    # endif
    #endif
    [omissis]
    #ifdef __frv__
    #define __ATTRIBUTE_IMPURE_PTR__ __attribute__((__section__(".sdata")))
    #endif
    #undef __RAND_MAX#if __INT_MAX__ == 32767
    #define __RAND_MAX 32767
    #else
    #define __RAND_MAX 0x7fffffff
    #endif
    come posso risolvere?? cosa cambia??

    il risultato di
    printf("\nRAND_MAX=%d\nINT_MAX=%d\n",RAND_MAX,__IN T_MAX__);
    è
    RAND_MAX=2147483647
    INT_MAX=2147483647

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 © 2025 vBulletin Solutions, Inc. All rights reserved.