Frage

Ich habe diese Funktion geschrieben, um einen Pseudo -zufälligen Float zwischen 0 zu erhalten. 1 inklusive:

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

Es kehrt jedoch immer 0,563585 zurück. Die gleiche Zahl, egal wie oft ich meine Konsolenanwendung ausführte.

BEARBEITEN:

Hier ist meine gesamte Anwendung bei Bedarf:

#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;
}
War es hilfreich?

Lösung

Sie müssen anrufen

srand(time(NULL));

vor Gebrauch rand zum ersten Mal. time ist in <time.h>.

Bearbeiten: Wie Jonathan Leffler betont, kann dies leicht vorhergesagt werden. Versuchen Sie es also nicht für die CryPrographie.

Andere Tipps

Das ist, weil Der C-Zufallsgenerator ist a Pseudo--Random Generator (Und das ist übrigens eine sehr gute Sache mit vielen Anwendungen). (Der ANSI C-Standard erfordert einen solchen Pseudo-Random-Generator)

Im Wesentlichen jedes Mal, wenn Ihre Konsolenanwendung neu gestartet wird Verwendet denselben [Standard] Saatgut für den Zufallsgenerator.

durch Hinzufügen einer Zeile wie

  srand(time(NULL));

Sie erhalten jedes Mal einen deutlichen Samen und die Abfolge der Anzahl, die mit dem entsprechenden variieren.
Notiz: Sie müssen nur einmal () srand () anrufen, nicht zuvor jedes Mal, wenn Sie Rand () anrufen.

Bearbeiten: (TEST/DEBUG-Zeit-Hinweis)
Aus einer Bemerkung von Artelius] Für Testzwecke ist es am besten für Srand (SOME_CONST) und den Wert der Konstante zwischen den Läufen zu ändern. Wenn sich ein Fehler aufgrund einer Kombination von Zufallszahlen manifestiert, können Sie ihn reproduzieren.

DRAND48 ist perfekt für Ihre Verwendung, besser als (float)rand()/RAND_MAX, Weil

Das drand48() und erand48() Funktionen geben nicht-negative, doppelte Präzisionsfloßpunktwerte zurück, die gleichmäßig über das Intervall verteilt sind [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;
}

Sie müssen einen zufälligen Samen mit initialisieren

void srand ( unsigned int seed );

Sie können zum Beispiel die Systemzeit nehmen.

Nennen Sie es mehr als einmal? Rand () gibt immer das gleiche Pseudo -Zufall zurück. Vielleicht möchten Sie Srand () mit einem schönen Samen anrufen, wie die aktuelle Zeit.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top