ランダムフロート番号
-
18-09-2019 - |
質問
私はこの関数を書き、0 .. 1包括的な擬似ランダムフロートを取得します:
float randomFloat()
{
float r = (float)rand()/(float)RAND_MAX;
return r;
}
ただし、常に0.563585を返しています。コンソールアプリケーションを何回実行しても同じ番号。
編集:
必要に応じて、これが私のアプリケーション全体です。
#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;
}
解決
あなたは電話する必要があります
srand(time(NULL));
使用する前 rand
初めて。 time
入っています <time.h>
.
編集:Jonathan Lefflerが指摘しているように、これは簡単に予測されるため、クリップに使用してみないでください。
他のヒント
それが理由です Cランダムジェネレーターはaです 擬似- ランダムジェネレーター (それは、ところで、非常に良いことで、多くのアプリケーションを備えています)。 (ANSI C標準には、そのような擬似ランダムジェネレーターが必要です)
基本的に、コンソールアプリケーションが再起動するたびに再起動します ランダムジェネレーターに同じ[デフォルト]シードを使用します.
次のような行を追加します
srand(time(NULL));
毎回明確な種子が得られ、それに応じて生成された数のシーケンスが生成されます。
ノート: :rand()を呼び出すたびに、srand()を1回呼び出すだけです。
編集: :(テスト/デバッグタイムのヒント)
Arteliusによる発言から]テストの目的で、Srand(some_const)に最適であり、実行間の定数の値を変更します。このようにして、乱数の組み合わせのためにバグが現れた場合、それを再現することができます。
drand48 あなたの使用に最適です、より良いです (float)rand()/RAND_MAX
, 、 なぜなら
drand48()
とerand48()
関数は、間隔[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;
}
ランダムシードを初期化する必要があります
void srand ( unsigned int seed );
たとえば、システムの時間をとることができます。
あなたはそれを複数回呼んでいますか? rand()は常に同じ擬似ランダムを返します。現在の時刻のように、いくつかの素敵な種子でsrand()に電話してください。