srand의 시드값을 time 함수의 리턴값으로 해놓고 rand 함수를 호출하면 늘 첫번째 값은 버려야 되는건가여?
#include <stdio.h>
아래 소스를 빌드해서 실행 , 종료를 반복해보면 1~100의 값이 랜덤으로 나오는게 아니라 시간차에 따라서 늘어나는 현상이 생김
rand 함수를 한 번 더 호출하면 정상적인 랜덤값이 나오는데 이게 왜이러는건가여?
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
srand((int) time(NULL));
printf(\"%d\\n\",rand()%100+1);
}
time_t t; 선언하고 srand(time_t(time(&t)); 이렇게 해봥
srand(time_t(time(&t))); 그렇게 해봐도 똑같음
다른 언어의 랜덤 함수는 안그러던데 이게 어찌된일임
시간차에따라 늘어난가는게 무슨소리징? 난이걸로 로또프로그램만들어서 잘쓰고있는데
srand 하는 이유가 상위비트로 돌리고 돌리면 더 좋은 랜덤이 나와서 그렇다 수학적으로 그렇데
시드 값을 타임을 줘서 그런 거임 그게 rand 자체가 의사 난수인지라 이미 만들어져 있는 테이블을 참조하는 방식이라 그럼
그 프로그램 껏다 킨 시간이 아주 살짝 변해서 난수열은 달라지지만 srand 자체가 정밀도가 좋지 않아서 첫값의 경우 증가하는 기현상을 봄... 그래서 충분히 무작위 적이고 정밀도도 높은 난수 알고리즘을 소개함 ㅇㅇ
대충 설명하면 두개의 변수를 둬서 그중 하나에 좀 적당히 큰 정수를 정해주고 다른 변수 하나에 그 큰정수의 정확히 두배되는 값을 지정해주고 그 큰정수 와 1사이의 값을 아무거나 하나 첫 시드 값으로 정해준다음 ( 큰정수 * 첫시드) + 큰정수 * 2 한녀석을 새로운 시드로 정해주고 그새 시드를 님이 제한하고자 하는 맥스 값의 나머지 연산을 해주고 그 값을 난수로 쓰면서 그 값을 다시 다음 값을 구할때의 시드 값으로 해주면 되겠음 말이 길어서 그렇지 코드로 하면 간단할꺼임
int gen1 = 1000422; int gen2 = gen1 *2; int seed = (time_t) time( NULL )%1000422; int max = 100; for(int a =0; a <10;a++) { int newseed = ( gen1 * seed ) + gen2; newseed = newseed % max; seed = newseed; printf(\"%d\\n\",seed); }
떱떱 저 알고리즘을 쓰면 위에 현상이 줄어들꺼임 클래스나 함수로 만들어 쓰면 편할꺼임 그건 알아서 해보면 좋겟습