Domanda

Ho scritto questa funzione per ottenere un float pseudo casuale tra 0 ..1 compreso:

float randomFloat()
{
      float r = (float)rand()/(float)RAND_MAX;
      return r;
}

Tuttavia, restituisce sempre 0,563585.Lo stesso numero indipendentemente da quante volte eseguo l'applicazione console.

MODIFICARE:

Ecco la mia intera domanda se necessario:

#include <stdio.h>
#include <stdlib.h>

float randomFloat()
{
      float r = (float)rand() / (float)RAND_MAX;
      return r;
}

int main(int argc, char *argv[])
{
  float x[] = {
        0.72, 0.91, 0.46, 0.03, 0.12, 0.96, 0.79, 0.46, 0.66, 0.72, 0.35, -0.16,
        -0.04, -0.11, 0.31, 0.00, -0.43, 0.57, -0.47, -0.72, -0.57, -0.25,
        0.47, -0.12, -0.58, -0.48, -0.79, -0.42, -0.76, -0.77
  };

  float y[] = {
        0.82, -0.69, 0.80, 0.93, 0.25, 0.47, -0.75, 0.98, 0.24, -0.15, 0.01,
        0.84, 0.68, 0.10, -0.96, -0.26, -0.65, -0.97, -0.03, -0.64, 0.15, -0.43,
        -0.88, -0.90, 0.62, 0.05, -0.92, -0.09, 0.65, -0.76      
  };

  int outputs[] = {
      -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
      1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
  };

  int patternCount = sizeof(x) / sizeof(int);

  float weights[2];
  weights[0] = randomFloat();
  weights[1] = randomFloat();

  printf("%f\n", weights[1]);

  float learningRate = 0.1;

  system("PAUSE");
  return 0;
}
È stato utile?

Soluzione

È necessario chiamare

srand(time(NULL));

prima di utilizzare rand per la prima volta. time è in <time.h>.

EDIT:. Come Jonathan Leffler sottolinea, questo è facilmente previsto, quindi non provare a utilizzare per cryprography

Altri suggerimenti

Questo perchè il generatore casuale C è a pseudo--generatore casuale (e questo è, a proposito, un'ottima cosa, con molte applicazioni).(Lo standard ANSI C richiede un tale generatore pseudo-casuale)

Essenzialmente ogni volta che l'applicazione console viene riavviata utilizza lo stesso seme [predefinito] per il generatore casuale.

aggiungendo una riga come

  srand(time(NULL));

otterrai ogni volta un seme distinto e la sequenza di numeri prodotti varierà di conseguenza.
Nota:devi chiamare srand() solo una volta, non prima di ogni volta che chiami rand().

Modificare:(Suggerimento in fase di test/debug)
Da un'osservazione di Artelius] per scopi di test, è meglio SRAND (Some_Const) e modificare il valore della costante tra le corse.In questo modo se un bug si manifesta a causa di una combinazione di numeri casuali, sarai in grado di riprodurlo.

drand48 è perfetto per il vostro uso, meglio di (float)rand()/RAND_MAX, perché

  

Le funzioni drand48() e erand48() restituiscono valori non negativo, doppia precisione, in virgola mobile, uniformemente distribuiti nell'intervallo [0.0, 1.0].

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
    int i;

    srand48(time(NULL));

    for (i = 0; i < 10; i++)
        printf("%g\n", drand48());

    return 0;
}

È necessario inizializzare un seme casuale con

void srand ( unsigned int seed );

Si può prendere per esempio il tempo di sistema.

Come si chiama più di una volta? rand () restituisce sempre la stessa pseudo casuale. Si potrebbe desiderare di chiamare srand () con qualche bel seme, come l'ora corrente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top