문제

나는이 기능을 썼다. 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가 지적한 것처럼, 이것은 쉽게 예측되므로 Cryprography에 사용하지 마십시오.

다른 팁

그 때문입니다 C Random-Generator는 a입니다 가짜-랜덤 생성기 (즉, 많은 응용 프로그램이있는 BTW입니다). (ANSI C 표준에는 그러한 의사 랜덤 생성기가 필요합니다)

본질적으로 콘솔 애플리케이션이 다시 시작될 때마다 임의의 생성기에 동일한 [기본] 시드를 사용합니다..

같은 줄을 추가하여

  srand(time(NULL));

당신은 매번 뚜렷한 씨앗을 얻게되며, 그에 따라 생성 된 숫자 순서는 그에 따라 다양합니다.
메모: rand ()을 호출 할 때마다 Srand ()를 한 번만 호출하면됩니다.

편집하다: (테스트/디버그 타임 힌트)
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 ()에게 전화 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top