Java에서 무작위 수의 생성 방식과 원리 상세 설명

Java에서 무작위 수의 생성 방식과 원리
무작위 수 관련 자료를 찾아보고 특별히 정리하다
우선 자바에서 랜덤 수가 나오는 몇 가지 방식을 말씀드릴게요.
  • j2se에서 우리는 Math를 사용할 수 있다.랜덤 () 방법으로 랜덤 수를 생성합니다. 이 랜덤 수는 0-1 사이의 더블입니다. 우리는 그를 100으로 곱할 수 있습니다. 그는 100 이내의 랜덤 숫자입니다. 이것은 j2me에 없습니다
  • 이 가방 안에 랜덤 클래스를 제공합니다. 우리는 랜덤 대상을 새로 만들어서 랜덤 수를 만들 수 있습니다. 랜덤 정수, 랜덤 플로트, 랜덤 더블, 랜덤 롱을 생산할 수 있습니다. 이것도 우리가 j2me 프로그램에서 자주 사용하는 랜덤 수를 추출하는 방법입니다
  • 우리의 시스템 클래스 중current Time Millis () 방법이 있습니다. 이 방법은 1970년 1월 1일 0시 0분 0초에서 현재의 밀리초로 되돌아옵니다. 되돌아오는 유형은 롱입니다. 우리는 그를 무작위 수로 할 수 있습니다. 우리는 그를 몇 개의 숫자에 대한 모델로 삼을 수 있고 그를 한 범위 안으로 제한할 수 있습니다
  • EN...사실 랜덤의 기본 구조 방법에서도 위의 세 번째 방법으로 무작위 수를 만들어 낸 것이다.
    방법 2의 Random류는 두 가지 구축 방식이 있는데 그것이 바로 씨앗을 가지고 있는 것과 씨앗을 가지고 있지 않은 것이다
    피드 없음: 이 방식은 무작위 숫자를 되돌려줍니다. 매번 실행 결과가 다르기 때문에 시스템을 사용하는 것과 같습니다.currentTimeMillis()를 씨앗으로 합니다.
    피드 가져오기: 프로그램이 몇 번 실행되든 결과는 똑같습니다.같은 피드로 두 개의 Random 실례를 만들면, 모든 실례를 같은 방법으로 호출하면 같은 숫자 서열을 생성하고 되돌려줍니다.
    위조 랜덤 수
    컴퓨터의 랜덤 수는 모두 위조 랜덤 수이다
    다음 C 프로그램을 살펴보겠습니다.
    
    // rand_1.cpp
    #include <stdlib.h>
    static unsigned int RAND_SEED;
    unsigned int random(void)
    {
      RAND_SEED = (RAND_SEED*123+59)%65536;
      return (RAND_SEED);
    }
    void random_start(void)
    {
      int temp[2];
      movedata(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("
    "); }
    그것은 무작위 수가 발생하는 과정을 완전하게 논술했다.
    우선,
    movedata(0x0040,0x006c,FP_SEG(temp),FP_OFF(temp),4);
    이 함수는 메모리 데이터를 이동하는 데 사용되며, 그 중에서 FP_SEG(far pointer to segment)는 temp 세그먼트 주소를 가져오는 함수입니다. FP_OFF(far pointer to offset)는temp수조의 상대적인 주소를 취하는 함수이며, movedata 함수의 역할은 0040:006CH 메모리 단원에 있는 두 글자를 수조temp의 성명된 두 메모리 단원에 넣는 것이다.이렇게 하면 temp 수조를 통해 0040:006CH에 있는 16자리의 수를 RAND_에게 보낼 수 있습니다SEED.
    그 다음,
    RAND_SEED=(RAND_SEED*123+59)%65536;
    랜덤수를 계산하는 방법이다. 랜덤수의 계산 방법은 서로 다른 컴퓨터에서 다르고, 같은 컴퓨터에 설치된 서로 다른 운영체제에서도 다르다.나는 linux와 윈도우즈에서 각각 시험해 보았는데, 같은 랜덤 피드가 이 두 운영체제에서 생성된 랜덤 수가 다르다는 것은 그들의 계산 방법이 다르다는 것을 설명한다.
    그리고
    movedata(0x0040,0x006c,FP_SEG(temp),FP_OFF(temp),4);
    랜덤 피드는 왜 메모리의 0040:006CH에서 찾으려고 합니까?0040:006CH에 보관된 것은 무엇입니까?
    '컴퓨터 구성 원리와 인터페이스 기술'이라는 과목을 배운 사람들은 ROM BIOS 시계 중단 서비스 프로그램을 작성할 때 인텔 8253 정시/계수기를 사용한다는 것을 기억할 수 있다. 인텔 8259 중단 칩과의 통신으로 중단 서비스 프로그램이 작동할 수 있다. 메인보드가 초당 18.2회 중단되는 것은 바로 프로세서가 정시/계수기 값에 따라 중단 칩을 제어하는 것이다.우리 컴퓨터의 호스트보드에는 현재 시스템의 시간을 계산하는 데 사용되는 정시/기수기가 있는데, 시계 신호 주기가 지나갈 때마다 기수기를 하나로 추가하는데, 이 기수기의 값은 어디에 저장됩니까?맞아요. 바로 메모리의 0040:006CH에 있습니다. 사실 이 메모리 공간은 이렇게 정의됩니다.
    TIMER_LOW DW ? ;주소: 0040:006CH
    TIMER_HIGH DW ? ;주소: 0040:006EH
    TIMER_OFT DB ? ;주소: 0040:0070H
    시계 인터럽트 서비스 프로그램(TIMER_LOW가 가득 차면 이때 카운터도 가득 차고, 카운터의 값은 0입니다. 즉, TIMER_LOW의 16비트 바이너리는 0이고 TIMER_HIGH 플러스 1.rand01.c의
    movedata(0x0040,0x006c,FP_SEG(temp),FP_OFF(temp),4);
    바로 TIMER_LOW 및 TIMER_HIGH 두 개의 16비트 이진수를temp 그룹에 넣고 RAND_SEED, 랜덤 시드 획득.
    현재 확실한 것은 랜덤 피드가 시스템 시계에서 왔다는 것이다. 정확히 말하면 컴퓨터 메인보드의 시간/계수기가 메모리에 기록된 수치이다.
    EN...마지막은 없어.lvl--
    코드 한 토막 더 보기:
    
    //rand_2.cpp
    #include <iostream>
    #include <cstdlib>
    using namespace std;
    int main()
    {
      srand((unsigned)time(NULL));
      unsigned int r=rand();
      cout<<"r = "<<r<<endl; // C++ 98 , return main 
      return 0;
    }
    
    여기에 사용자와 다른 프로그램이 랜덤 피드를 설정하지 않으면 시스템 시간/계수기의 값을 랜덤 피드로 사용하기 때문에 같은 플랫폼 환경에서 exe를 컴파일하여 생성한 후에 매번 실행할 때마다 표시되는 랜덤 수는 위조 랜덤 수이다. 즉, 실행할 때마다 표시되는 결과는 다르다.
    총결산
    랜덤 수는 랜덤 씨앗이 일정한 계산 방법에 따라 계산한 수치다.따라서 계산 방법이 일정하고 랜덤 씨앗이 일정하면 발생하는 랜덤 수는 변하지 않는다.같은 플랫폼 환경에서 exe를 컴파일하여 생성한 후 실행할 때마다 표시되는 랜덤 수는 같습니다.이는 같은 컴파일 플랫폼 환경에서 랜덤 피드가 랜덤 수를 생성하는 계산 방법이 똑같고 랜덤 피드가 같기 때문에 발생하는 랜덤 수가 똑같기 때문이다.
    사용자나 제3자가 랜덤 피드를 설정하지 않으면 기본적으로 랜덤 피드는 시스템 시계에서 온다 (즉 정시/계수기의 값)
    읽어주셔서 감사합니다. 여러분에게 도움이 되었으면 좋겠습니다. 본 사이트에 대한 지지에 감사드립니다!

    좋은 웹페이지 즐겨찾기