Note/coding

[NOTE : coding] 난수생성(rand(),srand(),time()) (C언어)

jir4vvit 2021. 3. 25. 14:55

환경 : ubuntu 18.04

hackCTF random_key 문제 풀면서 정리해봤다. 예전에 학교에서 배운 적 있었는데 이 랜덤 개념이 생각보다 자주 쓰인다고 해서 정리를 해보려고 한다. 

(근데 NOTE 카테고리 취지가 조금 짧게 짧게 적는 ... 그런 노트 느낌인데 coding 카테고리는 뭔가 예외인 느낌..)


1. rand() 함수

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

int main(void)
{
	printf("rand : %d\n", rand());
	printf("rand : %d\n", rand());
	printf("rand : %d\n", rand());
	printf("rand : %d\n", rand());
	printf("rand : %d\n", rand());
	printf("rand : %d\n", rand());
	printf("rand : %d\n", rand());
	printf("rand : %d\n", rand());
}

random이라면서 random이 아니다. 프로그램을 실행할 때마다 바뀌지 않는다.

내가 원하는 random은 이런 것이 아니다.

실행할 때마다 전체가 샤샤샥 바뀌었으면 좋겠다...

 

2. srand() 함수

사실 위에 rand()함수 결과가 저런 것은 이 srand() 함수 때문이다. rand() 함수는 srand() 함수에 의존적이다.

 

seed값에 따라 rand() 값이 바뀌게 되는데 위에서는 딱히 srand()를 직접 호출하지 않았으므로 rand() 값이 바뀌지 않은 것이다. (딱히 srand()를 직접 호출하지않으면 자동으로 srand(1)가 호출된다.)

 

srand() 함수로 seed를 설정을 해준다고 생각하면 될 듯 하다.

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

int main(void)
{
	printf("[1] rand()\n");
	printf("[+] rand : %d\n", rand());
	printf("[+] rand : %d\n", rand());
	printf("\n");

	printf("[2] rand() with same srand()\n");
	srand(111);	
	printf("[+] rand : %d, seed : %d\n", rand(), 111);
	srand(111);
	printf("[+] rand : %d, seed : %d\n", rand(), 111);
	srand(111);
	printf("[+] rand : %d, seed : %d\n", rand(), 111);
	printf("\n");

	printf("[3] rand() with another srand()\n");
	for (int i = 1; i < 5; i++)
	{
		srand(i);
		printf("[+] rand : %d, seed : %d\n", rand(), i);
	}

	return 0;
}

마지막 [3]을 보면 seed값에 따라 rand값이 다르게 출력되는 것을 확인할 수 있다.

(참고로 srand 인자값, 즉 seed는 양수만 올 수 있다. unsigned)

 

하지만... 실행할때마다 계속 바뀌지는 않는다.. 왜냐면 seed값이 여전히 고정이니까..? ...

계속 변하는 seed가 뭐가 있을까..? 아 시간!

 

3. 진짜 랜덤 (feat. time()) 

현재 시간을 이용하여 진짜 랜덤을 만들어 보자.

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

int main(void)
{
	//srand((unsigned int)time(NULL));
	srand(time(0));

	for (int i = 0; i < 20; ++i)
	{
		int random = rand();
		printf("[+] random : %d\n", random);
	}

	return 0;
}

time(0)은 현재 시간을 의미한다.

덕분에... 딱 봐도 random값이 다르다. 

 

이제 우리는 프로그램을 여러번 실행해도 다른 랜럼 값을 얻을 수 있다.!!!!!

 

 

 

 

'Note > coding' 카테고리의 다른 글

[NOTE : coding] git remote branch 가져오기  (0) 2022.05.21
[NOTE : coding] C에서 0과 NULL의 차이?  (0) 2021.01.25