Avatar billede jih Nybegynder
19. november 2008 - 14:28 Der er 10 kommentarer og
1 løsning

Rnd problemer

Hej,

jeg har et program som generer forskellige random passwords. Mit problem er at jeg skal til tider tjekke om koden har 2 (og kun 2) store bogstaver, hvis ikke, skal den generere en ny.

Findes der en smart måde at gøre dette på, eller må jeg nøjes med den tid det tager et køre et loop indtil den helt automatisk gør det?

I det her tilfælde bruger jeg denne funktion:

Function funcGenerateRandom()
    Dim intI, intJ As Integer
    Dim strS As String
   
    Randomize ' Forskellige numre hver gang
   
loop1: ' Hvis koden har mere eller mindre end 2 store bogstaver
    For intI = 1 To 8
loop2: ' Hvis der er symboler mellem Chr(90) og Chr(97)
        intJ = funcRandom(65, 122) ' Små bogstaver
        If (intJ < 97) And (intJ > 90) Then GoTo loop2
        strS = strS & Chr(intJ)
    Next intI
   
    ' Test om koden har 2 (og kun 2) store bogstaver
    intJ = 0
    For intI = 1 To 8
        If (Mid(strS, intI, 1) > Chr(64)) And (Mid(strS, intI, 1) < Chr(91)) Then
            intJ = intJ + 1
        End If
    Next intI
    If (intJ < 2) Or (intJ > 2) Then GoTo loop1
    ' Testet om koden havde 2 (og kun 2) store bogstaver
       
    frmMain.txtPass.Text = strS
End Function
Avatar billede jih Nybegynder
19. november 2008 - 14:29 #1
glemte lige at nævne at definitionen af funcRandom funktion er denne:

Function funcRandom(intLow As Integer, intHigh As Integer) As Integer
    funcRandom = Int((intHigh - intLow + 1) * Rnd) + intLow
End Function
Avatar billede erikjacobsen Ekspert
19. november 2008 - 15:13 #2
Hvad med at udvælge dine bogstaver, så du tager to store tilfældigt og seks små tilfældigt. fx "AAaaaaaa", og derefter blander deres placering?
Avatar billede jih Nybegynder
19. november 2008 - 15:40 #3
har tænkt på det, men ved ikke hvordan jeg så blander dem?
Avatar billede erikjacobsen Ekspert
19. november 2008 - 15:55 #4
Med Rnd-funktionen
Avatar billede jih Nybegynder
19. november 2008 - 16:43 #5
ja, så langt kom jeg ;p

Hvordan får jeg så blandet dem med en Rnd funktion? Altså, jeg kan godt finde ud af at lave en Rnd funktion til de små bogstaver, og til de store.. men jeg aner ikke hvordan jeg skal blande de store imellem de små.. kan du hjælpe mig med det?
Avatar billede kabbak Professor
19. november 2008 - 18:17 #6
kan du bruge en fast funktion, som returnerer en streng

Function funcRandom() As String

'(65, 122) ' bogstaver (91 til 96) tegn
    Dim TælStore As Integer, Tælsmå As Integer, funcRand As Integer
    Dim intLow As Integer, intHigh As Integer
    intLow = 65
    intHigh = 122
    Do
        If TælStore = 2 Then intLow = 97 ' antal store bogstaver
        If Tælsmå = 6 Then intHigh = 90 ' antal små bogstaver
Gentag:
        Randomize    ' Forskellige numre hver gang
        funcRand = Int((intHigh - intLow + 1) * Rnd) + intLow
        If funcRand < 91 Then TælStore = TælStore + 1
        If funcRand > 96 Then Tælsmå = Tælsmå + 1
        If funcRand >= 91 And funcRand <= 96 Then GoTo Gentag
        funcRandom = funcRandom & Chr(funcRand)
    Loop Until Len(funcRandom) = 8 ' total antal bogstaver
End Function
Avatar billede erikjacobsen Ekspert
19. november 2008 - 21:28 #7
Du kan få en skitse til min idé (i VBScript, ASP-agtigt):

<%

Function funcRandom(intLow, intHigh)
    funcRandom = Int((intHigh - intLow + 1) * Rnd) + intLow
End Function

randomize
Dim a(7)
a(0)= Chr(funcRandom(65, 90)) ' Store bogstaver
a(1)= Chr(funcRandom(65, 90)) ' Store bogstaver
a(2)= Chr(funcRandom(97, 122)) ' Små bogstaver
a(3)= Chr(funcRandom(97, 122)) ' Små bogstaver
a(4)= Chr(funcRandom(97, 122)) ' Små bogstaver
a(5)= Chr(funcRandom(97, 122)) ' Små bogstaver
a(6)= Chr(funcRandom(97, 122)) ' Små bogstaver
a(7)= Chr(funcRandom(97, 122)) ' Små bogstaver

strS=""
For i=0 To UBound(a)
  strS = strS & a(i)
next

response.write(strS & "<br>")

For i=0 To Ubound(a)
  r = funcRandom(0,UBound(a))
  tmp=a(i):a(i)=a(r):a(r)=tmp
next

strS=""
For i=0 To UBound(a)
  strS = strS & a(i)
next

response.write(strS & "<br>")

%>
Avatar billede arne_v Ekspert
20. november 2008 - 01:42 #8
Mit forslag:

Function GenPassword(nchar As Integer, nupcas As Integer)
    Const valid As String = "abcdefghijklmnopqrstuwvxyz"
    Dim res As String
    Dim i, n, ix As Integer
    Dim uc() As Boolean
    Randomize
    ReDim uc(nchar)
    n = nupcas
    While n > 0
        ix = funcRandom(1, nchar)
        If Not uc(ix) Then
            uc(ix) = True
            n = n - 1
        End If
    Wend
    res = ""
    For i = 1 To nchar
        If uc(i) Then
            res = res & UCase(Mid(valid, funcRandom(1, Len(valid)), 1))
        Else
            res = res & Mid(valid, funcRandom(1, Len(valid)), 1)
        End If
    Next
    GenPassword = res
End Function
Avatar billede jih Nybegynder
24. november 2008 - 09:34 #9
nu står jeg ikke sådan og mangler et stykke kode per se.. Jeg manglede lidt inspiration og den fik jeg af erikjacobsens kode. :-) Det sker så sjældent at jeg bruger arrays at jeg tænkte slet ikke på muligheden. Jeg takker for svarene.
Erikjacobsen samler vel stadigvæk ikke på points? Hvis du gør, smid så et svar. :-)

(Tak til kabbak og arne_v også, men det var desværre ikke lige det jeg ledte efter)
Avatar billede erikjacobsen Ekspert
24. november 2008 - 09:40 #10
Nej tak, ingen point til mig.
Avatar billede jih Nybegynder
24. november 2008 - 09:57 #11
Så tager jeg dem selv. Fortsat god dag.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester