6,318 개의 임의 단어가 들어있는 MySQL 데이터베이스 테이블이 있습니다.
해당 테이블에서 선택을 수행하고 단어를 배열에 넣는 약간의 코드가 있습니다.
나는 임의의 단어 조합을 추출하는 함수를 작성했습니다. 예를 들어 8 자 길이입니다.
내가 가진 문제는 함수가 그렇게 무작위로 보이지 않는다는 것입니다. 표에 6,318 개의 단어가 있으므로 8 자 길이의 단어 조합이 수백 개라는 것을 알고 있지만 코드 출력이 동일한 조합을 반복하는 경우가 많습니다.
다음은 코드입니다.
<%
SQL1 = "SELECT fld_un FROM j_un2 ORDER BY rand()"
'##############################################################################
set p1RS = oConn.Execute(SQL1)
list1 = p1RS.GetRows
p1RS.Close
block1 = ""
For row = 0 to UBound(list1,2)
block1 = block1 & list1(0,row) & ","
next
Erase list1
wordArray1 = split(block1, ",")
Function f1(str)
found = "no"
max=6138
min = 1
do while found <> "yes"
Randomize
rand1 = Int((max-min+1)*Rnd+min)
rand2 = Int((max-min+1)*Rnd+min)
word = wordArray1(rand1) & wordArray1(rand2)
if len(word) = str + 1 then
found = "yes"
f1 = word
end if
Loop
End Function
for i = 1 to 10
bob = f1(8)
response.write bob & "<br />"
next
%>
샘플 출력 :
싹 네일 epeestove buggersix splatsane urbanbash pinevital shootnail epeestove buggersix splatsane
보시다시피 일부 조합은 반복됩니다. 예를 들어 위의 추출에서 다음 두 조합 만 고유합니다.
어반 바시 파인 비탈
이렇게하면 (예 : 출력 20) :
for i = 1 to 20
bob = f1(8)
response.write bob & "<br />"
next
그러면 어떤 조합도 고유하지 않습니다.
raftsniff hitactive nineridge tartmagma turnbuyer klutzpity acceptlose bookspell herbshare raftsniff hitactive nineridge tartmagma turnbuyer klutzpity acceptlose bookspell herbshare raftsniff hitactive
나는 명백한 것을 놓치고 있는가-나는 그들이하는 것처럼 조합이 반복되는 이유를 알아낼 수 없다.
여기서 문제는 .NET 사용과 관련하여 인터넷의 다른 예에서 배운 오해 Randomize()
입니다.
Randomize()
기본적으로 시스템 시간에서 가져온 시드 값을 생성하여 작동합니다 (계속 변경되므로 결과는 항상 무작위이어야합니다) . 이 시드는 Rnd()
에서 임의 값을 생성하는 데 사용됩니다 .
Randomize()
1 초에 여러 번 계산할 수있는 루프 안에가 배치 되면 사실상 동일한 값으로 다시 시드됩니다.
으로는 Randomize()
의 초기 씨앗 제공 Rnd()
한 후 실행 코드에서 여러 번 호출 할 이유가 없다 사용에 있습니다. Randomize()
클래식 ASP 페이지 상단에서 함수를 한 번 호출하면 값을 시드 Rnd()
한 다음 모든 코드 (루프 또는 기타)를 통해 사용할 수 있습니다 .
질문의 특정 문제를 해결하려면 Randomize()
코드의 모든 루프를 완전히 제거하고 (가급적이면 페이지 상단 근처에) 배치 하여 임의 시드를 한 번 설정합니다.
질문의 예제를 사용하면 다음과 같이 보일 것입니다.
<%
'Call Randomize() once to set the seed for the page.
Randomize
SQL1 = "SELECT fld_un FROM j_un2 ORDER BY rand()"
'##############################################################################
set p1RS = oConn.Execute(SQL1)
list1 = p1RS.GetRows
p1RS.Close
block1 = ""
For row = 0 to UBound(list1,2)
block1 = block1 & list1(0,row) & ","
next
Erase list1
wordArray1 = split(block1, ",")
'Removed Randomize() from the f1() function, Rnd() will now use the
'seeded value set at the beginning of the code.
Function f1(str)
found = "no"
max=6138
min = 1
do while found <> "yes"
rand1 = Int((max-min+1)*Rnd+min)
rand2 = Int((max-min+1)*Rnd+min)
word = wordArray1(rand1) & wordArray1(rand2)
if len(word) = str + 1 then
found = "yes"
f1 = word
end if
Loop
End Function
for i = 1 to 10
bob = f1(8)
response.write bob & "<br />"
next
%>
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다