King of Stock

클래스 소개 - SplittableRandom 본문

IT 기술

클래스 소개 - SplittableRandom

king of stock 2018. 3. 23. 20:36


SplittableRandom 클래스


병렬 처리와 랜덤 숫자를 추출하는 형태의 로직을 구현할 때에 이용하면 좋을(?) 클래스입니다.

java 1.8 부터 나온 이 클래스는 java api에서 다음과 같이 설명하고 있습니다.

해석을 제 맘데로 해서... 원문 api doc 읽어보시는걸 강추합니다.



A generator of uniform pseudorandom values applicable for use in (among other contexts) isolated parallel computations that may generate subtasks. Class SplittableRandomsupports methods for producing pseudorandom numbers of type int, long, and doublewith similar usages as for class Random but differs in the following ways:


균일한 난수값들을 생성하는 클래스이다. 이는 다른 컨텍스트 사이에서 격리된 병렬 계산 처리에 사용할때 적절하다.

int, long, double 타입의 난수를 만들어내는 메서드들이 제공되며 사용법이 Random 클래스와 비슷하다 하지만 다음에 같은 점에서 다르다.


  • Series of generated values pass the DieHarder suite testing independence and uniformity properties of random number generators. (Most recently validated withversion 3.31.1.) These tests validate only the methods for certain types and ranges, but similar properties are expected to hold, at least approximately, for others as well. The period (length of any series of generated values before it repeats) is at least 264.
  • Method split() constructs and returns a new SplittableRandom instance that shares no mutable state with the current instance. However, with very high probability, the values collectively generated by the two objects have the same statistical properties as if the same quantity of values were generated by a single thread using a single SplittableRandom object.
  • Instances of SplittableRandom are not thread-safe. They are designed to be split, not shared, across threads. For example, a fork/join-style computation using random numbers might include a construction of the form new Subtask(aSplittableRandom.split()).fork().
  • This class provides additional methods for generating random streams, that employ the above techniques when used in stream.parallel() mode.


생성된 연속된 값들은 난수 발생기들의 독립성과 균일한 속성을 테스팅한 DieHarder suite를 통과 했다.( 가장 최근에 검증된 3.31.1 버전으로 ) 이 테스트는 특정 범위들과 유형들에 대한 방법들만을 검증하지만 비슷한 값들은 적어도 대략 다른 값에 대해서 유지될것으로 예상된다. 범위( 반복되기 전에 생성된 어떤값의 길이 )는 적어도 2에 64승이다.


메서드 split()은 새로운 객체를 생성하고 리턴한다. 현재 객체의 가변 상태를 공유하지 않는다. 그러나 높은 확률로 2개의 객체간에 수집되어 생성된 값들은 동일한 통계적 속성들을 가진다. 속성들은 마치 1개의 스레드를 사용한 1개의 SplittableRandom 클래스의 객체에 의해 생성된 같은 양의 값들을 의미한다.


SplittableRandom 객체들은 thread-safe 하지 않다. 그 객체들은 thread간에 분할 될 수 있고 공유 되지 않도록 디자인(구성) 되어있습니다. 예를 들면 랜덤 숫자들을 사용한 fork/join 스타일의 계산이 어떤 하위 작업을 생성하여 fork() 메서드가 호출된 형태를 포함한다.


이 클래스는 stream.parallel() 모드에서 사용될때 위에있는 기법들을 이용해 랜덤 스트림을 생성하기 위한 추가적인 메서드들을 제공한다. 


Instances of SplittableRandom are not cryptographically secure. Consider instead using SecureRandom in security-sensitive applications. Additionally, default-constructed instances do not use a cryptographically random seed unless the system property java.util.secureRandomSeed is set to true.


SplittableRandom 객체들은 암호로 보호되지 않는다. 보안에 민감한 애플리케이션은 대신 SecureRandom 클래스 사용을 고려해라. 또한 시스템 프로퍼티(java.util.secureRandomSeed)가 true로 셋팅이 안 되어 있으면 기본 생성자의 객체는 암호화된 랜던 seed를 사용하지 않는다.



 java doc:

https://docs.oracle.com/javase/8/docs/api/java/util/SplittableRandom.html


googling중에 SplittableRandom의 존재를 알았던 Stackoverflow:

https://stackoverflow.com/questions/29193371/fast-real-valued-random-generator-in-java


다이하드:

https://en.wikipedia.org/wiki/Diehard_tests


관련소스(제 소스입니다. -_-):

https://github.com/smartkuk/smartkuk-coupon


해석이 이상할꺼에요 -_-; 느낌만 가져가시고 출처의 원문을 읽어보세요.



Comments