본문 바로가기

ai와 놀기

C 언어 완벽한 난수를 찾아서

컴퓨터는 난수를 만들어 낼 수 없다고 한다.

난수를 생성하는 인공지능

그래서 내부의 특수한 알고리즘으로 난수를 만든다.

 

C 언어에서는 아래와 같이 보통 난수를 만든다.

 

그냥 rand만 쓰면 똑같은 난수가 나오니, 1970년 1월 1일 이후의 시간 값을 seed값(기준값으로 이해하자)을 

이용해서 난수를 생성하는 것이다.

그러면 매번 실행할 때마다 다른 난수가 나온다.

#include<stdio.h>
#include<stdlib.h> //rand() 함수 포함 라이브러리
#include<time.h>
int main()
{
	//time(NULL) : 1970년 1월 1일 이후 경과된 시간을 초 단위로 변환
	//그 값을 seed(씨앗)으로 해서 매번 다른 난수가 생성되도록 함
	srand(time(NULL));
	int random = (rand() % 45)+1;
	printf("%d\n", random);
}

출처 : C 랜덤 - 난수 생성하기 (tistory.com)

 

C 랜덤 - 난수 생성하기

C언어 프로그래밍에서 코드를 작성하다보면 무작위의 숫자가 필요한 경우가 존재합니다. 보통 무작위 숫자를 난수라고 표현합니다. C언어에서 난수를 표현하기 위해서는 라이브러리를 사용해

yeolco.tistory.com

 

이 코드의 맹점이 하나 있다.

 

나와 다른 사람이 각자의 컴퓨터에서 동시에 실행하면 똑같은 난수가 나온다는 것이다.

그래서 AI에게 헬프를 쳤다.

 

처음엔 엉뚱한 소리를 한다.
내 말을 알아들어 줬구나
이거 괜찮네!?

그러나 이 방법에도 문제는 있다. seed를 똑같은 값을 입력하면 당연히 똑같은 난수가 출력된다는 것이다.

이거 획기적이다.

문제는 이건 리눅스 계열에서 돌아가는 코드다. 

gcc를 깔아야 할까? 그러기엔 귀찮다.

 

로그인 안 해서 그런가 횟수가 너무 짧다. 로그인하면 30번 할 수 있는 데...

아숙업한테 물어보자

내가 하도 그림만 그리니까 저걸 그리라는 걸로 착각한 것 같다
다시 또 물어봐야 되네
두 번 물어보게 만드네
도대체 뭐가 다른거야.

빙에 직접 검색을 했다.

 

드디어 찾았다!

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

int main()
{
    srand(GetCurrentProcessId());
    int random = rand() % 45 + 1;
    printf("%d\n", random);
    return 0;
}

windows API를 활용하여 만들었다. 역시 리눅스/유닉스 계열에 있는 건 웬만한 건 windows API에 다 있다.

 

한 학생의 예리한 질문 덕에(두 사람이 동시에 실행하면 같은 랜덤값이 나오나요?) 

좋은 코드를 발견했다.

 

감사하다.