usar randomize rand_max rand float como c random floating-point floating-point-conversion

randomize - Número de flotación aleatorio



randomize en c (5)

Escribí esta función para obtener un flotador pseudo aleatorio entre 0 .. 1 inclusive:

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

Sin embargo, siempre devuelve 0.563585. El mismo número sin importar cuántas veces ejecute mi aplicación de consola.

EDITAR:

Aquí está toda mi aplicación si es necesario:

#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; }


¿Lo llamas más de una vez? rand () siempre devolverá el mismo pseudoaleatorio. Es posible que desee llamar a srand () con un poco de simiente, como la hora actual.


Eso es porque el generador aleatorio C es un generador pseudo- aleatorio (y eso es, por cierto, algo muy bueno, con muchas aplicaciones). (El estándar ANSI C requiere un generador pseudoaleatorio)

Básicamente, cada vez que se reinicia la aplicación de la consola, utiliza la misma semilla [predeterminada] para el generador aleatorio .

agregando una línea como

srand(time(NULL));

Obtendrá una semilla distinta cada vez, y la secuencia de números producida variará en consecuencia.
Nota : solo necesita llamar a srand () una vez, no antes cada vez que llame a rand ().

Edición : (Prueba / sugerencia de tiempo de depuración)
[a partir de una observación de Artelius] Para fines de prueba, es mejor hacer srand (SOME_CONST) y cambiar el valor de la constante entre ejecuciones. De esta forma, si un error se manifiesta debido a una combinación de números aleatorios, podrá reproducirlo.


Tienes que inicializar una semilla aleatoria con

void srand ( unsigned int seed );

Puede tomar, por ejemplo, la hora del sistema.


Tienes que llamar

srand(time(NULL));

antes de usar rand por primera vez. time está en <time.h> .

EDITAR: Como señala Jonathan Leffler, esto es fácil de predecir, así que no intentes usarlo para criptografía.


drand48 es perfecto para su uso, mejor que (float)rand()/RAND_MAX , porque

Las drand48() y erand48() devuelven valores de punto flotante no negativos, de doble precisión, distribuidos uniformemente en el 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; }