2014-03-06 3 views
0

임의로 생성 된 XX00XXX 형식의 문자열을 생성하는 VBA 함수를 만들었습니다. Excel 스프레드 시트에 400000 개가 넘는 일련 번호를 작성하기 위해이 코드를 실행했지만 동일한 문자열에 대한 반복 횟수가 비정상적으로 많습니다. 문자열의 60 % 이상에서 인스턴스가 두 개 이상 (경우에 따라> 250 개)! 나는 약간의 재구성을 기대할 것이다. 그러나이 수준 근처의 아무 곳에도. 내 코드에 문제가 있습니까? 또는 아마도 이것은 추첨을 할 나의 주입니다.VBA 무작위로 생성 된 문자열 반복 - 왜?

Function NewVRN() As String 

Dim strOne As String 
Dim strTwo As String 
Dim strThree As String 
Dim strFour As String 
Dim strFive As String 
Dim strSix As String 
Dim strSeven As String 



' Initialize the seed using Timer. 
    Randomize 

'Generate random letters 
    strOne = Chr(Int((90 - 65 + 1) * Rnd) + 65) 
    Randomize 
    strTwo = Chr(Int((90 - 65 + 1) * Rnd) + 65) 
    Randomize 
    strFive = Chr(Int((90 - 65 + 1) * Rnd) + 65) 
    Randomize 
    strSix = Chr(Int((90 - 65 + 1) * Rnd) + 65) 
    Randomize 
    strSeven = Chr(Int((90 - 65 + 1) * Rnd) + 65) 
    Randomize 

'Generate random numbers 
    strThree = Chr(Int((57 - 48 + 1) * Rnd) + 48) 
    Randomize 
    strFour = Chr(Int((57 - 48 + 1) * Rnd) + 48) 


'Concatenate and build the VRN 
     NewVRN = strOne & strTwo & strThree & strFour & strFive & strSix & strSeven 

End Function 

함수가 제 (함수 호출 시점)을 다른 "재료"및 않는 하위의 일부로서 호출은 단순히 셀에 결과를 기록하고 다음 셀을 선택한다. 이 작업은 다른 작업없이 빠르게 연속적으로 수행됩니다. 내가 알 수있는 한, 연속 호출은 일반적으로 다음 호출에서 반복되지 않습니다.

여기에 다른 솔루션을 살펴 보았지만이 특정 문제에 대한 답변은없는 것 같습니다. 사무실에있는 RNG에는 제한이 있다는 것은 인정되지만, 여기에있는 관찰은 극단적이라고 생각합니다. 현대 프로세서에도 문제가 있습니다 (타이머 간격 당 여러 계산)하지만 randomize 문과 함수의 독립적 인 실행으로이를 해결해야합니다.

P. 나는 확률이 최소한의 반복 수를 의미한다는 수락을 통해 임의 순서의 대부분이 유일한 목록을 원했다. 결국 나는 순서 (예 : AA00AAA, AA00AAB 등)에 하나를 추가하는 루프를 만들었습니다. 나는 아직도 내 무작위 발전기가 작동하지 않는 이유를 알고 싶다!

+0

또한 공개 도메인에 고유 한 임의의 숫자 배열을 만드는 솔루션이 있습니다. 정렬되지 않은 문자열과 상당히 많은 볼륨으로 작업한다는 점을 감안할 때 생성 된 문자열을 이전의 불법리스트와 비교하는 것이 실용적이지 않다고 생각합니다. – RandomDave

답변

1

프로그램 시작시 Randomize 번만 호출하면됩니다.

Randomize (시드를 지정하지 않고)을 호출 할 때마다 VB는 시스템 타이머를 사용하여 다음에 사용할 임의 번호를 설정합니다.

빠른 연속으로 Randomize을 호출하면 동일한 임의 번호를 사용하여 VB가 실행될 위험이 있습니다. 이는 사용자가 관찰 한 것입니다.

+0

감사합니다. 나는 이것을 시도 할 것이다. 매번 랜덤 화 된 이유는 초기 시드 다음에이를 읽었 기 때문입니다. RNG는 이전의'rnd' 계산을 시드로 사용하여 고정 된 시퀀스를 따릅니다. 이것을 읽은 나는 AA00AFH GG66PHH를 많이 얻을 수있는 상황을 피하고자했습니다. – RandomDave

+0

100,000 회 반복의 샘플을 기반으로하면이 문제가 해결 된 것으로 보입니다. 감사합니다. 원래 코드를 사용하여 10 만 회 반복을 비교 한 결과 어떤 시점에서는 10 % 미만 만 복제되었습니다. 제안 된대로 코드를 수정하면 반복이 전혀 발생하지 않습니다. – RandomDave

+0

@RandomDave 당신이 읽은 바로는 고정 된 시퀀스이지만 그 시퀀스는 랜덤 (의사)이며 매우 길다. Randomize는 시퀀스에서 다음 번 RND 번호를 얻는 위치를 설정하며 RND를 호출 할 때마다 시퀀스의 다음 번호로 이동합니다. – ForkandBeard

관련 문제