Java의 랜덤 숫자의 방법과 원리
랜덤 숫자와 관련된 정보를 확인하고 특별히 정리하십시오.
먼저 Java에서 랜덤 숫자를 생성하는 몇 가지 방법에 대해 이야기 해 봅시다.
en. . . 실제로 위의 세 번째 방법은 랜덤의 기본 구성 방법에서 임의 숫자를 생성하는 데 사용됩니다.
방법 2 : 씨앗과 씨앗이없는 무작위 클래스를 구축하는 두 가지 방법이 있습니다.
씨앗이 없으면 :이 방법은 임의의 숫자를 반환하고 각 실행 결과는 System.currentTimeMillis ()를 종자로 사용하는 것과 같습니다.
씨앗의 경우 : 이런 식으로 프로그램의 몇 번이나 실행 되더라도 반환 결과는 동일합니다. 동일한 시드로 두 개의 임의 인스턴스가 생성되면 각 인스턴스에 동일한 메소드 호출 시퀀스가 이루어지며 동일한 숫자를 생성하고 반환합니다.
의사 랜덤 번호
컴퓨터의 임의 숫자는 의사 랜덤 숫자입니다
다음은 다음과 같은 C 프로그램입니다.
// rand_1.cpp#포함 <stdlib.h> 정적이지 않은 int rand_seed; unsigned int random (void) {rand_seed = (rand_seed*123+59)%65536; return (rand_seed);} void random_start (void) {int temp [2]; mizatata (0x0040,0x006c, fp_seg (temp), fp_off (temp), 4); rand_seed = temp [0];} void main () {unsigned int i, n; random_start (); for (i = 0; i <10; i ++) printf ( "#u/t", random ()); printf ( "/n");} 무작위 숫자 생성 과정을 완전히 설명합니다.
첫 번째,
mizatata (0x0040,0x006c, fp_seg (temp), fp_off (temp), 4);
이 기능은 메모리 데이터를 이동하는 데 사용됩니다. FP_SEG (Far Pointer to Segment)는 임시 배열의 세그먼트 주소를 취하는 함수이며, FP_OFF (FAR POINTER TO OFFSET)는 임시 배열의 상대 주소를 취하는 함수이며, MizedATA 기능은 0040 : 006CH 스토리지 장치에 위치한 이중 단어를 배열 온도에 의해 선언 된 두 메모리 유닛에 넣는 것입니다. 이러한 방식으로 0040 : 006ch의 16 비트 번호는 임시 배열을 통해 Rand_seed로 보낼 수 있습니다.
두번째,
rand_seed = (rand_seed*123+59)%65536;
임의 숫자를 계산하는 데 사용되는 방법입니다. 임의 숫자의 계산 방법은 동일한 컴퓨터에 설치된 다른 운영 체제에서도 다른 컴퓨터마다 다릅니다. 각각 Linux와 Windows에서 시도했습니다. 이 두 운영 체제에서 동일한 임의의 씨앗에 의해 생성 된 랜덤 숫자는 다르기 때문에 계산 방법이 다릅니다.
그 다음에,
mizatata (0x0040,0x006c, fp_seg (temp), fp_off (temp), 4);
임의의 씨앗을 메모리에서 0040 : 006ch에서 검색 해야하는 이유는 무엇입니까? 0040 : 006ch에 저장되는 것은 무엇입니까?
코스 "컴퓨터 구성 요소 및 인터페이스 기술의 원칙"을 연구 한 사람들은 ROM BIOS 클럭 인터럽트 서비스 프로그램을 컴파일 할 때 인텔 8253 타이밍/카운터가 사용된다는 것을 기억할 수 있습니다. Intel 8259 인터럽트 칩과의 통신을 통해 인터럽트 서비스 프로그램이 작동 할 수 있습니다. 초당 마더 보드에 의해 생성 된 18.2 인터럽트는 타이밍/카운터 값에 따라 프로세서 제어에 의해 생성됩니다. 현재 시스템 시간을 계산하기 위해 컴퓨터의 마더 보드에 이러한 타이밍/카운터가 있습니다. 카운터는 시계 신호주기가 지나갈 때마다 추가됩니다. 이 카운터의 값은 어디에 저장됩니까? 맞습니다. 메모리에서 0040 : 006ch 에이 메모리 공간은 실제로 다음과 같이 정의됩니다.
timer_low dw?; 주소는 0040 : 006ch입니다
Timer_high DW?; 주소는 0040 : 006EH입니다
TIMER_OFT DB? ; 주소는 0040 : 0070H입니다
클럭 인터럽트 서비스 프로그램에서 Timer_Low가 가득 차면 카운터도 가득 차고 카운터 값이 0이됩니다. rand01.c
mizatata (0x0040,0x006c, fp_seg (temp), fp_off (temp), 4);
임시 배열에 배치되어 rand_seed로 보내져 "임의의 시드"를 얻는 것은 두 개의 16 비트 바이너리 숫자 Timer_Low와 Timer_high입니다.
이제 결정할 수있는 한 가지는 임의의 시드가 시스템 시계에서 나오는 것입니다.
ko ... 마지막은 없습니다. . LVL--
다른 코드를 살펴 보겠습니다.
//rand_2.cpp#include <iostream> #include <cstdlib> 네임 스페이스 std; int main () {srand (unsigned) time (null)); 서명되지 않은 int r = rand (); cout << "r ="<< r << endl; // C ++ 98 표준에 따르면, 반환 명령문을 사용하지 않고 기본 함수를 소개 할 수 있습니다. 0;} 여기서, 사용자 및 기타 프로그램이 임의의 시드를 설정하지 않으면 시스템 타이밍/카운터의 값은 임의의 시드로 사용됩니다. 따라서 동일한 플랫폼 환경에서 EXE를 컴파일하고 생성 한 후에는 실행할 때마다 표시되는 임의의 숫자는 의사 랜덤 숫자가됩니다. 즉, 실행할 때마다 표시되는 결과가 다릅니다.
요약
랜덤 숫자는 특정 계산 방법에 따라 임의의 종자에 의해 계산 된 값입니다. 따라서 계산 방법이 확실하고 임의의 시드가 확실하다면, 생성 된 임의의 숫자는 변하지 않습니다. 동일한 플랫폼 환경에서 EXE를 컴파일하고 생성 한 후에는 실행할 때마다 표시되는 임의의 숫자가 동일합니다. 이는 동일한 컴파일 플랫폼 환경에서 임의의 시드로부터 임의의 숫자를 생성하는 계산 방법이 동일하고 임의의 시드는 동일하기 때문에 생성 된 임의 숫자는 동일하기 때문입니다.
사용자 또는 제 3자가 임의의 시드를 설정하지 않는 한, 기본적으로 임의의 시드는 시스템 클럭 (즉, 타이밍/카운터 값)에서 나옵니다.
읽어 주셔서 감사합니다. 도움이되기를 바랍니다. 이 사이트를 지원 해주셔서 감사합니다!