I wrote this function to get a pseudo random float between 0 .. 1 inclusive:
float randomFloat()
{
float r = (float)rand()/(float)RAND_MAX;
return r;
}
However, it is always returning 0.563585. The same number no matter how many times I run my console application.
EDIT:
Here is my entire application if needed:
#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;
}
drand48 is perfect for your usage, better than
(float)rand()/RAND_MAX
, becauseYou have to initialize a random seed with
You can take for example the system time.
That is because the C random-generator is a pseudo-random generator (and that is, BTW, a very good thing, with many applications). (The ANSI C standard requires such a pseudo-random generator)
Essentially each time your console application is re-started it uses the same [default] seed for the random generator.
by adding a line like
you will get a distinct seed each time, and the sequence of number produced with vary accordingly.
Note: you only need to call srand() once, not before each time you call rand().
Edit: (Test/Debug-time hint)
[from a remark by Artelius] For testing purposes, it's best to srand(SOME_CONST), and change the value of the constant between runs. This way if a bug manifests itself due to some combination of random numbers, you'll be able to reproduce it.
You need to call
before using
rand
for the first time.time
is in<time.h>
.EDIT: As Jonathan Leffler points out, this is easily predicted, so don't try using it for cryprography.
Do you call it more than once? rand() will always return the same pseudo random. You might want to call srand() with some nice seed, like the current time.