11

この関数を作成して、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;
}
4

5 に答える 5

13

あなたは電話する必要があります

srand(time(NULL));

rand初めて使用する前に。timeにあり<time.h>ます。

編集:ジョナサン・レフラーが指摘しているように、これは簡単に予測できるので、暗号化に使用しないでください。

于 2009-11-07T23:44:05.657 に答える
10

これは、Cランダムジェネレーターが疑似ランダムジェネレーターであるためです(つまり、多くのアプリケーションで非常に優れています)。(ANSI C規格では、このような疑似ランダムジェネレータが必要です)

基本的に、コンソールアプリケーションが再起動されるたびに、ランダムジェネレーターに同じ[デフォルト]シードが使用されます。

次のような行を追加することによって

  srand(time(NULL));

毎回異なるシードを取得し、それに応じて生成される番号の順序は異なります。
:srand()を呼び出す必要があるのは1回だけで、rand()を呼び出すたびに呼び出す必要はありません。

編集:(テスト/デバッグ時のヒント)
[Arteliusによるコメントから]テストの目的で、srand(SOME_CONST)を実行し、実行間で定数の値を変更することをお勧めします。このようにして、乱数の組み合わせが原因でバグが発生した場合でも、それを再現することができます。

于 2009-11-07T23:45:12.783 に答える
6

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;
}
于 2009-11-08T00:09:26.467 に答える
2

ランダムシードを初期化する必要があります

void srand ( unsigned int seed );

たとえば、システム時間を取ることができます。

于 2009-11-07T23:45:44.603 に答える
1

あなたはそれを複数回呼び出しますか?rand() は常に同じ疑似乱数を返します。現在の時刻など、適切なシードを指定して srand() を呼び出すことができます。

于 2009-11-07T23:46:46.490 に答える