2008년 2월 4일 월요일

추억6. MSX-BASIC과 HU-BASIC의 RND() 함수의 차이

SYNOPSIS

#include <stdlib.h>
int rand(void)

DESCRIPTION

The rand() function returns a pseudo-random integer between 0 and RAND_MAX.
If no seed value is provided, the rand() function is auto-matically seeded with a value of 1.

RETURN VALUE

The rand() function returns a value between 0 and RAND_MAX.

C/C++에서 난수를 발생시키는 함수는 rand() 이고, 0~RAND_MAX(보통 32767) 사이의 난수를 생성합니다.
BASIC에서 이러한 기능을 하는 함수는 rnd()입니다.

어릴 때 컴퓨터 학원에서는 SPC-1000을, 집에서는 MSX를 사용하던 시기가 있었습니다.
학원에서 배운 것을 집에서 종종 시험해보고는 했는데, 두 기종 간의 이질감을 발견한 것이 rnd() 함수였습니다.

MSX에서는 매번 실행할 때마다 같은 난수가 나오기 때문에 난수를 난수답게 나오게 할 무엇인가가 필요했는데, SPC-1000은 언제나 다른 난수가 발생했습니다.
난수의 기본구조 즉, 의사 난수(pseude-random number)를 생성한다는 것을 알고 나서 더 놀랍더군요.
의사 난수라는 개념상, 난수는 어떤 식을 통해 생성된 값이므로 같은 조건에서는 같은 결과가 나오거든요…

아래와 같은 코드를 작성해서 계속 실행하면 두 기종에서는 다른 결과를 보여줍니다.
10 A = RND(1)*100
20 PRINT A


이 비밀(?)을 알게된 것이 MSX에서는 난수의 seed를 무작위로 부여하기 위해서 RND(-TIME)을 호출하는데, SPC-1000에서는 이런 기능 자체가 없다는 것을 알면서 부터였습니다.
(C언어의 srand() 호출 방식/개념과 상당히 유사합니다)

한편, C/C++ 언어는 이 부분이 잘 정의되어 있기 때문에 이러한 혼란(?) 없이 사용할 수 있답니다.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(int argc, char* argv[])
{
	srand( (unsigned)time( NULL ) ); // 난수를 난수답게
	int i = rand();
	printf("%d\n", i);

	return 0;
}



댓글 3개:

  1. 까만 화면에 파란 텍스트. 전 한 번도 못본 화면이네요.ㅇㅅㅇ

    매트릭스 이후로 처음.....

    몇년도 OS인가요?

    저도 맞트랙백(?)을 ㅎㅎ

    답글삭제
  2. trackback from: 난수 발생함수 rand(), 난수 범위 지정하기
    프로그래밍 카테고리에도 글이 좀 쌓이는 것 같다. (8개?)난수 발생의 범위를 지정하는 방법, 요렇게변수 = rand() % (종료 값 - 시작 값 + 1) + 시작 값100부터 1000 사이의 난수를 발생시키려면변수 = rand() % (1000 - 100 + 1) + 100간단히 하면변수 = rand() % (901) + 100이렇게 되지요.이건 난수 1,000개를 발생시켜서 최소값, 최대값 출력하는 소스. #include &lt;stdio.h...

    답글삭제
  3. @환타 - 2008/02/15 18:20
    1984년요 ^^;;;

    당시에는 Z-80이라는 3.xx MHz(GHz 아님) 8비트 CPU를 사용하는 PC가 세상을 지배하고 있었더랍니다.

    답글삭제