자바에서 무작위 수의 몇 가지 실현 방식을 간단히 말하다

2674 단어 Java무작위 수
모두가 알다시피 랜덤수는 어떤 프로그래밍 언어의 가장 기본적인 특징 중의 하나이다.랜덤 수를 생성하는 기본 방식도 같다. 0에서 1 사이의 랜덤 수를 생성한다.간단해 보이지만 때때로 우리는 재미있는 기능을 소홀히 하기도 한다.
우리는 책에서 무엇을 배웠습니까?
가장 뚜렷하고 직관적인 방식으로 자바에서 무작위 수를 생성하는 것은 간단한 호출만 하면 된다.

java.lang.Math.random()

모든 다른 언어에서 랜덤 수를 생성하는 것은 abs, pow,floor, sqrt와 다른 수학 함수를 사용하는 것과 같다.대다수의 사람들은 서적, 교과서, 과정을 통해 이런 종류를 이해한다.간단한 예: 0.0에서 1.0 사이에 이중 정밀도 부동점수가 생성될 수 있다.그러면 위의 정보를 통해 개발자는 0.0과 10.0 사이의 이중 정밀도 부동 포인트를 생성하여 이렇게 쓴다.

Math.random() * 10

0과 10 사이의 정수가 생성되면 다음과 같이 됩니다.

Math.round(Math.random() * 10)

진급
읽기 Math.random()의 원본 코드나 아예 IDE의 자동 완성 기능을 이용하면 개발자가 쉽게 발견할 수 있습니다.java.lang.Math.random () 은 내부의 랜덤 생성 대상을 사용합니다. - 강력한 대상은 유연하게 랜덤으로 생성할 수 있습니다. 부울 값, 모든 디지털 유형, 심지어 고스 분포입니다.예:

new java.util.Random().nextInt(10)

그것은 하나의 결점이 있는데, 바로 그것이 대상이라는 것이다.그것의 방법은 반드시 하나의 실례를 통해 호출해야 한다. 이것은 반드시 그것의 구조 함수를 먼저 호출해야 한다는 것을 의미한다.만약 메모리가 충분한 상황에서 위의 표현식과 같이 받아들일 수 있다.그러나 메모리가 부족할 때 문제가 생긴다.
하나의 간단한 해결 방안은 매번 무작위 수를 생성해야 할 때마다 새로운 실례를 만드는 것을 피할 수 있다. 그것은 정적 클래스를 사용하는 것이다.자바가 생각났나 봐요.lang. Math, 좋아, 우리가 개량자바야.lang. Math의 초기화비록 이 공사량은 낮지만, 너도 간단한 단원 테스트를 해서 그것이 틀리지 않도록 확보해야 한다.
프로그램이 무작위 수를 만들어서 저장해야 한다고 가정하면 문제가 또 발생한다.예를 들어 때로는 피드 (seed) 를 조작하거나 보호해야 하는데, 하나의 내부 수는 상태를 저장하고 다음 무작위 수를 계산하는 데 쓰인다.이런 특수한 상황에서 무작위 생성 대상을 공용하는 것은 적합하지 않다.
병발하다
Java EE 멀티스레드 응용 프로그램 환경에서 무작위 생성 실례 대상은 클래스나 다른 실현 클래스에 저장되어 정적 속성으로 사용할 수 있다.다행히도, 자바.util.Random은 스레드가 안전하기 때문에 여러 개의 스레드 호출이 씨앗(seed)을 파괴할 위험이 없습니다.
또 다른 고려할 만한 것은 다선정 자바다.lang.ThreadLocal의 인스턴스입니다.게으름을 피우는 방법은 자바 자체 API를 통해 단일 실례를 실현하는 것이다. 물론 모든 라인에 자신의 실례 대상이 있다는 것을 확보할 수 있다.
자바는 자바를 관리하는 좋은 방법을 제공하지 않았지만.util.Random의 단일 인스턴스입니다.그러나 기대했던 Java 7은 랜덤 수를 생성하는 새로운 방식을 제공합니다.

java.util.concurrent.ThreadLocalRandom.current().nextInt(10)

이 새로운 API는 다른 두 가지 방법의 장점을 종합했다. 단일 실례/정적 접근, 예를 들어 Math와 같다.random () 처럼 유연합니다.ThreadLocalRandom도 다른 어떤 처리보다 병렬 처리 방법이 더 빠르다.
경험
Chris Marasti-Georg는 다음과 같이 말합니다.

Math.round(Math.random() * 10)

분포를 불균형하게 한다. 예를 들어 0.0-0.4999999는 반올림을 0으로 하고 0.5~1.4999999는 반올림을 1로 한다.그러면 구식 문법을 사용하여 정확한 균형 분포를 실현하는 방법은 다음과 같다.

Math.floor(Math.random() * 11)

다행히도 우리가java를 사용한다면.util.Random 또는java.util.concurrent.Thread Local Random은 상술한 문제를 걱정할 필요가 없습니다.
Java 실전 프로젝트에서 java를 잘못 사용한 것을 소개했습니다.util.Random API의 해로움.이 교훈은 우리에게 사용하지 말라고 알려준다.

Math.abs(rnd.nextInt())%n

사용:

rnd.nextInt(n)


좋은 웹페이지 즐겨찾기