머드클럽
머드게임이란?
게임은 어떤 환경에서?
본격적으로 게임해 볼까?
배너교환
머드강좌
일반 머드강좌
성천사님의 머드강좌
혼님의 머드강좌
방울꽃님의 머드강좌
리트님의 머드강좌
2Soo님의 머드강좌
내머드소개하기
접속가능머드
내머드소개하기
자료실
접속 프로그램
머드소스
머드 유틸리티
기타
커뮤니티
공지사항
등업신청
머드클럽에바란다
자유 게시판
질문 AND 답변
머드클럽 갤러리
구인구직
머드게임소개
사신전(死神戰)
사신전 소개
사신전 맵
사신전 명령어 모음집
천명(天命)
천명 소개
천명 맵
천명 명령어 모음집
마이페이지
로그인
회원가입
계정찾기
로그인
회원가입
계정찾기
텍스트머드클럽
검색
신세계 64비트 난수 처리
성천사
0
151
0
0
2025-01-01 21:19:11
<p>VC6.0 에서 32비트는 문제 없이 난수가 생성이 가능한데, int 형을 초과한 난수생성이 불가능 하다는 것을 알고 이런 저런 시도를 해 보았습니다. 시도를 한것이 __int64 number64(__int64 min, __int64 max) 의 gset_73_3 == 0 이고, 이 조잡한 코드는 최소치의 제한이 있는(아마도 1%) 코드입니다. 그래서 고민고민하다 시도를 한 것이 gset_73_3 == 1 이고, 이것은 32비트 * 32비트는 64 비트 인 것을 참고해서 실수형 난수 생성 함수 double db_number(double from, double to) 함수와 최종 난수 생성 후 수치 return 용 _int64 _number64(__int64 from, __int64 to) 함수, 그리고 number64 로 입력받은 최소 최대치의 제곱근을 구해 return 하는 double number_split(__int64 num_split, int opt) 함수를 만들어 적용을 했습니다. 단순히 흉내내기용 입니다만 VC6.0 에서 사용가능한 64비트 난수생성 코드를 찾을 수도 없어서 만들었습니다. 일단 작동은 한다는데 의의를 두고 있습니다. 물론 좀 더 높은 버전의 개발도구를 사용한다면 이런것들은 다 쓸모 없습니다.</p> <p> </p> <p><span style="color:#c0392b;">number64() 안의 gset_73_3 은 제 머드에만 있는 설정 변수 이기 때문에 다른 머드에서는 else {} 부분만을 떼어 쓰면 됩니다.</span></p> <p> </p> <p>__int64 number64(__int64 min, __int64 max)<br /> {<br /> __int64 _number64(__int64 from, __int64 to);<br /> extern __int64 max64;<br /> extern int fullint; <br /> int m = 0, endint = 0;<br /> __int64 a = 0, c = 0, e = 0, f = 0, g = 0, temp = 0;<br /> double b = 0, h = 0, l = 0, n = 0, o = 0;<br /> char ranumber[MAX_INPUT_LENGTH]="";</p> <p> if (gset_73_3 == 0) { // 난수처리(외부오설정)<br /> if (min == max)<br /> return max;</p> <p> if (max < fullint) {<br /> _number64_to_number:<br /> endint = number((int)min, (int)max);<br /> return endint;<br /> }</p> <p> if (max < 1)<br /> return 0;</p> <p> h = (double)(e = min);<br /> l = (double)(f = max);<br /> g = (__int64)(f * 0.01);<br /> a = (__int64)((e < g) ? 1 : ((h / l) * 100));<br /> m = (int)a;<br /> b = number(m, 100);<br /> c = (__int64)(f * (o = ((b < 1) ? (b + 1) : (b * 0.01))));<br /> if (c < e)<br /> c = e;<br /> else if (c > f)<br /> c = f;<br /> return c;<br /> } else {<br /> // 난수처리에 sqrt 사용<br /> if (min > max) { // 최소값이 최대값보다 크면<br /> temp = min; // 최소값을 temp 로<br /> min = max; // 최소값에 최대값을 넣고<br /> max = temp; // 최대값에 temp 넣기<br /> }</p> <p> if (max <= fullint || (max <= 0)) // 최대값이 fullint (2147483647) 이하라면<br /> goto _number64_to_number; // 73_3 == 0 안의 number() 로 처리</p> <p> sprintf(ranumber, "%I64d", _number64(min, max));<br /> return _atoi64(ranumber);<br /> } <br /> }</p> <p> </p> <p>double db_number(double from, double to) <br /> {<br /> double tmp;</p> <p> if (from > to) {<br /> tmp = from;<br /> from = to;<br /> to = tmp;<br /> }</p> <p> return (rand() / (double)RAND_MAX) * (to - from) + from;</p> <p>}</p> <p> </p> <p>// VC 6.0 에는 없는 64비트 난수 처리로 인해 32비트 이상의 난수 발생이 불가능 해<br /> // 입력받은 값을 sqrt 를 사용해 int * int 를 해서 계산 후 출력. 64비트 난수 생성을 흉내낸 코드<br /> // 2024-05-26, 최종 2025-01-01<br /> __int64 _number64(__int64 from, __int64 to)<br /> {<br /> double db_number(double from, double to);<br /> extern int maxint;<br /> int number(int from, int to);<br /> double number_split(__int64 num_split, int opt);<br /> double fromfirst = 0.0, fromsecond = 0.0, tofirst = 0.0, tosecond = 0.0;<br /> double calc1 = 0.0, calc2 = 0.0, last = 0.0;<br /> int normal = 0;</p> <p> </p> <p> if (from <= maxint && to <= maxint) {<br /> normal = number((int)from, (int)to);<br /> return normal;<br /> }</p> <p> </p> <p> // 입력한 최소값에 대한(from) 제곱근 계산<br /> // 64 비트는 32 비트 * 32 비트 이므로<br /> // 최소값을 절반으로 나눈 값의 제곱근을 fromfirst 에 넣는다. 옵션 0<br /> // 나머지 절반의 값을 fromsecond 에 넣는다. 옵션 1<br /> // 이후 최대값도 같은 방식으로 제곱근을 얻어 number() 함수를 사용해 <br /> // int 크기의 최소, 최대 제곱근 사이의 난수를 구해<br /> // 최종적으로 발생한 최소 최대의 난수를 곱한 값에 2 를 곱해 <br /> // 64 비트의 난수를 얻는다.<br /> <br /> // 최소값 from<br /> fromfirst = number_split(from, 0);<br /> fromsecond = number_split(from, 1);</p> <p> </p> <p> // 최대값 to<br /> tofirst = number_split(to, 0);<br /> tosecond = number_split(to, 1);</p> <p> </p> <p> // 합산<br /> calc1 = db_number(fromfirst, tofirst);<br /> calc2 = db_number(fromsecond, tosecond);<br /> last = (calc1 * calc2) * 2;<br /> return (__int64)last;<br /> }</p> <p> </p> <p>double number_split(__int64 num_split, int opt)<br /> {<br /> __int64 split = num_split;<br /> double first = sqrt((double)split / 2.0);<br /> double second = split / (2.0 * first);</p> <p> </p> <p> if (opt == 0) {<br /> return first;<br /> } else if (opt == 1) {<br /> return second;<br /> }<br /> return 0.0;<br /> }</p> <p> </p>
0
0
새글
답변
수정
삭제
최신목록
전체목록
TBAMUD 한글 아이디 저장 함수
접속금지, 접속허용 편의성 수정
정회원 이상만 코멘트 사용이 가능합니다.
총 게시물 29개 / 검색된 게시물: 29개
TBAMUD 한글 아이디 저장 함수
0
88
0
0
성천사
2025-03-29
신세계 64비트 난수 처리
0
152
0
0
성천사
2025-01-01
접속금지, 접속허용 편의성 수정
0
179
0
0
성천사
2024-10-27
신세계 텍스트 출력
1
208
0
0
성천사
2024-08-06
신세계 시체생성
0
179
0
0
성천사
2024-06-12
삭제된 게시물입니다.
0
124
0
0
성천사
2024-06-12
신세계 C to VC6.0
0
348
0
0
성천사
2024-03-07
신세계 장비위치 구하기
0
203
0
0
성천사
2024-03-04
신세계 파일 존재여부 확인
0
264
0
0
성천사
2024-02-18
신세계 맙타입 전투
0
295
0
0
성천사
2023-12-02
신세계 addlog()
0
247
0
0
성천사
2023-10-25
신세계 캐릭터, 맙 이동 코드
0
254
0
0
성천사
2023-10-25
신세계 지정번호의 물건 찾기및 제거하기
0
358
0
0
성천사
2023-05-07
신세계 이동물건
1
621
0
0
성천사
2022-12-30
신세계 날씨변경 명령어
0
421
0
0
성천사
2022-12-25
[circle]
신세계 운영자 명령어 방청소
0
476
0
0
성천사
2022-10-08
[circle]
신세계 물건이름
0
513
0
0
성천사
2022-08-26
[circle]
신세계 공격대상
0
535
0
0
성천사
2022-08-19
[circle]
미확인장소 물건 수거
0
1015
0
0
성천사
2019-09-23
[circle]
신세계 포탈과 이동 명령어
1
1452
0
0
성천사
2018-09-05
1
2
다음
검색
글쓰기
최신목록
전체목록
시작일
종료일
검색어
이름
제목
내용
검색
닫기
로그인
회원가입
계정찾기
개인정보처리방침
이용약관
PC화면
Copyright (c) 텍스트머드클럽. All rights reserved.
쪽지를 전송하고 있습니다. 잠시 기다려주세요.
쪽지보내기
받는이(ID/닉네임)
닉네임으로 입력
내용
쪽지가 도착하였습니다.
쪽지함
쪽지 내용을 읽어오고 있습니다. 잠시 기다려주세요.
--