임의의 플로트 번호
-
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가 지적한 것처럼, 이것은 쉽게 예측되므로 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 ()에게 전화 할 수 있습니다.