2011-02-11 3 views
4

난수 생성에 다음을 사용합니다. 내가 원하는 무엇얼랭 - 난수 생성기

3> erlang:ref_to_list(make_ref()). 

"#Ref<0.0.0.36>" 

음이 나는 이전 포스트에서 할 수있는 통보 한 것을

00,036이었다입니다. make에서 ref를 추출하는 것이 그리 쉽지 않다.

누구나 쉽게 할 수있는 방법을 보여줄 수 있습니까, 아니면 다른 해결책을 추천 할 수 있습니까?

random : seed()를 사용하는 것이 동일한 몇 나노 초 이내에 호출 될 때 임의가 아닙니다.

감사

+2

난수 생성기를 호출 할 때마다 다시 시드하지 마십시오. 한 번 시드 후 사용하십시오. 'random' 모듈은 이것을 완벽하게 처리합니다. – nmichaels

+0

임의의 숫자 또는 고유 번호를 원하면 명확하게 할 수 있습니까? 그들은 매우 다른 생물이고 _no way_에서 'make_ref'는 난수를 생성합니다. – archaelus

+0

네, 임의의 숫자를 사용하고자하는 것을 추가하십시오. 게임, 시뮬레이션 또는 보안입니까? 보안을 위해서는 완전히 다른 난수가 필요합니다. –

답변

21

참고 : OTP (18)erlang:now/0및 사용되지 않습니다random모듈 및 OTP (20)에서random모듈을 제거합니다. 자세한 내용은 Time and Time Correction in Erlang을 참조하십시오. 또한 rand:uniform/0을 사용하는 경우 더 이상 프로세스 별 시드를 수행 할 필요가 없습니다. 다음은 참고 용으로 그대로 남겨 둡니다.


random을 잘못 사용하고있는 것이 문제입니다. random:seed/0은 항상 동일한 시드로 난수 생성기를 시드합니다. 이것은 당신이 원하는 것에는 좋지 않습니다. 오히려 random:seed(erlang:now())을 사용하여 다른 숫자, 즉 현재 시간으로 시드 할 수 있습니다.

"두 통화가 매우 가까워지면 어떻게됩니까?" 너는 묻는다. ,

은 튜플 {MegaSecs,는 초, MicroSecs} 00시 (그리니치 표준시)부터 경과 시간 년 1 월 1 일을 반환 : 음, 얼랑 사람은 그렇게 now/0는 항상 증가 숫자를 반환 보장이 생각 기본 OS가 이것을 지원한다는 가정하에 에서 1970 (제로시). 그렇지 않은 경우 다른 특정 시점이 선택됩니다 ( ). 또한이 BIF에 대한 호출이 지속적으로 증가하는 값을 반환한다는 것을 보장합니다. 따라서 now()의 반환 값은 개의 고유 한 타임 스탬프를 생성하는 데 사용될 수 있으며 빠른 컴퓨터에서 엄격한 루프에서 호출되는 경우 노드 시간이 왜곡 될 수 있습니다.

(강조 광산)

또한 random PRNG는 당 과정이다, 그래서 당신은 항상 시더 호출하여 프로세스를 시작해야 함을 유의하십시오

init([..]) -> 
    random:seed(erlang:now()), 
    [..] 
    {ok, #state { [..] }}. 

참조를 사용하여 왜냐하면 이것은 아마도 가능할 수 있지만, 나는 이것이 실행 가능하다고 생각하지 않는다. 해결책은 erlang:ref_to_list/1을 지나치며 귀엽지 않습니다.

+0

지금 재미있는 점에 대해 감사드립니다(). 내 앱 타이밍을 맞춰서 1 마이크로 초가되었다. 내 시간이 더 빨라질 수도 있다는 말과 함께! 어떤 방법 으로든 편집 할 수 있습니까? – BAR

+1

고유 한 값 (아무도 다른 값을 가짐) 또는 임의 값 (아무도 값을 쉽게 추측 할 수 없음)을 원한다면 여전히 말하지 않았습니다. 또한 임의성이 필요한 범위를 어느 정도 명시하지 않았습니다. 당신은 그러한 것들에 대해 상세히 설명 할 수 있습니다 - 그렇지 않으면 사람들은 당신을 도울 수 없습니다. –

+2

+1 "PRNG는 프로세스 별"입니다. 이것은 실제로 제가 찾고있는 정보였습니다. – Dacav