Pergunta

Eu escrevi esta função para obter um pseudo -flutuação aleatória entre 0 .. 1 inclusive:

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

No entanto, está sempre retornando 0,563585. O mesmo número, não importa quantas vezes eu execute meu aplicativo de console.

EDITAR:

Aqui está todo o meu aplicativo, se necessário:

#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;
}
Foi útil?

Solução

Você precisa ligar

srand(time(NULL));

antes de usar rand pela primeira vez. time é em <time.h>.

EDIT: Como Jonathan Leffler aponta, isso é facilmente previsto, portanto, não tente usá -lo para o Cryprography.

Outras dicas

Isso é porque o gerador aleatório C é um pseudo-Random gerador (E isto é, btw, uma coisa muito boa, com muitas aplicações). (O padrão ANSI C requer um gerador tão pseudo-aleatom)

Essencialmente cada vez que seu aplicativo de console é reiniciado usa a mesma semente [padrão] para o gerador aleatório.

adicionando uma linha como

  srand(time(NULL));

Você receberá uma semente distinta a cada vez, e a sequência de número produzida varia de acordo.
Observação: Você só precisa ligar para Srand () uma vez, não antes de cada vez que você liga para Rand ().

Editar: (Dica de teste/tempo de depuração)
De uma observação de Artelius] Para fins de teste, é melhor para Srand (Some_Const) e alterar o valor da constante entre as corridas. Dessa forma, se um bug se manifestar devido a alguma combinação de números aleatórios, você poderá reproduzi -lo.

Drand48 é perfeito para o seu uso, melhor do que (float)rand()/RAND_MAX, Porque

o drand48() e erand48() As funções retornam valores de ponto flutuante não negativos, de precisão dupla, distribuídos uniformemente sobre o intervalo [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;
}

Você tem que inicializar uma semente aleatória com

void srand ( unsigned int seed );

Você pode levar, por exemplo, o tempo do sistema.

Você chama isso mais de uma vez? Rand () sempre retornará o mesmo pseudo -aleatório. Você pode querer ligar para Srand () com uma boa semente, como a hora atual.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top