Avatar billede l_otto Nybegynder
26. maj 2008 - 13:13 Der er 38 kommentarer

Tal kombination der ikke må være ens til bankoplader

Jeg skal bruge en kode eller et script der kan følgende:

Scriptet skal spytte 1.000 (plader) kombinationer ud med 15 numre i hver kombination men ingen af kombinationerne må have de samme tal kombinationer.

Tallene er fra 0-99.
Avatar billede soerenlyn Nybegynder
26. maj 2008 - 13:57 #1
Må der heller ikke være taldubletter i hver kombination?
Avatar billede l_otto Nybegynder
26. maj 2008 - 14:00 #2
jo det må der gerne
Avatar billede natsprinter Nybegynder
26. maj 2008 - 14:44 #3
<table border="1" align="center">
<%
'sæt variabler
'antal bankoplader
dim plade(15)

plader = 1000

'Numre pr. plade
antal = 15

'Maximum antal tal (skal være 100 fordi 0 skal tælle med)
maxTal = 100


        Function findTal(r)
       
            'find et tilfældigt tal
            randomize
            tal = int(rnd()*maxTal)       
       
            ' undersøg om tallet findes på pladen allerede
            if not r = 1 then

                for s = 1 to r
                    if plade(s) = tal then
                        findTal(r)
                    end if
                next
           
            end if
                   
            ' sæt tallet i et array
            plade(r) = tal
       
        end Function   




for t = 1 to plader
response.Write("<tr><td>PLADE "&t&"</td>")
   
    for r = 1 to antal
        'hent et tilfældigt tal
        findTal(r)
       
        response.Write("<td height='40' width='40' align='center'>"&plade(r)&"</td>")
           
    next

response.Write("</tr>")
next
%>
</table>
Avatar billede w13 Novice
26. maj 2008 - 14:47 #4
Natsprinter>> Jeg ville nok placere randomize allerøverst i koden, så den ikke bliver kørt, hver gang findTal() køres. Min erfaring er nemlig, at gentagen brug af randomize i samme kode, vil resultere i en meget forudsigelig kode af en eller anden grund.

Det kan dog være, at det ikke gælder, når den er placeret i en funktion?
Avatar billede w13 Novice
26. maj 2008 - 14:50 #5
Men der tjekkes vel heller ikke i den kode, om der er andre plader, der har samme kombination?
Avatar billede l_otto Nybegynder
26. maj 2008 - 14:57 #6
det ser godt ud..men JA den skal lige sørge for at de 15 tal den vælger til en enkelt plade IKKE er på en anden plade
takker
Avatar billede frand Nybegynder
26. maj 2008 - 15:31 #7
En alternativ måde:

<%
Set plade = Server.CreateObject("Scripting.Dictionary")
Set plader = Server.CreateObject("Scripting.Dictionary")
Randomize

'sorter et array
Function BSort(arr)
    Dim i, j, x
    For i=0 To UBound(arr)-1
        For j=i+1 To UBound(arr)
            If arr(i) > arr(j) Then
                x = arr(i)
                arr(i) = arr(j)
                arr(j) = x
            End If
        Next
    Next
    BSort = arr
End Function


For i=1 To 1000
    Do
        plade.RemoveAll

        For j=0 To 14
            Do
                num = Int(Rnd*99)+1
            Loop While plade.Exists(num)

            plade.Add num, 1
        Next

        strPlade = Join(BSort(plade.Keys), ",")

    Loop While plader.Exists(strPlade)

    plader.Add strPlade, i
Next


For Each key In plader
    Response.Write "Plade " & plader(key) & ": " & key & "<br>"
Next
%>
Avatar billede l_otto Nybegynder
26. maj 2008 - 15:43 #8
tjekker den at der ikke er to ens plader ?
Avatar billede l_otto Nybegynder
26. maj 2008 - 15:45 #9
tallet 0 kommer ikke med på nogle af pladerne
Avatar billede w13 Novice
26. maj 2008 - 15:47 #10
For at få 0 med, skal du vist bare rette:
                num = Int(Rnd*99)+1
til:
                num = Int(Rnd*99)
Avatar billede w13 Novice
26. maj 2008 - 15:47 #11
Næh, det bør så nok være:
                num = Int(Rnd*100)
Avatar billede l_otto Nybegynder
26. maj 2008 - 15:53 #12
ja så kom 0 med... men tjekker den der ikke er to ens plader?
Avatar billede w13 Novice
26. maj 2008 - 15:54 #13
Det ser ud til, at den burde.
Avatar billede w13 Novice
26. maj 2008 - 15:55 #14
Jo, det sørger:
  Loop While plader.Exists(strPlade)
for.
Avatar billede l_otto Nybegynder
26. maj 2008 - 16:00 #15
sweeeeet mange tak , svar den der skal have point
Avatar billede w13 Novice
26. maj 2008 - 16:03 #16
Det må være frand så, hvis det er hans kode, du har benyttet.
Avatar billede natsprinter Nybegynder
26. maj 2008 - 16:05 #17
Dem skal du gi' til frand - det er en nydelig kode han der har skrevet :-)
Avatar billede cpufan Juniormester
26. maj 2008 - 23:12 #18
hvis det er banko, går tallene jo kun fra 1 til 90 .

bare et lille øf - hvis det ska' ligne banko ;-)
Avatar billede l_otto Nybegynder
27. maj 2008 - 08:30 #19
ja jeg har set det og ændret i koden... cpufan er nok en gammel bingo haj :-)
Avatar billede cpufan Juniormester
27. maj 2008 - 21:42 #20
nemli ;-)  ............. not

men har da spillet om pebernødder til jul...
Avatar billede cpufan Juniormester
27. maj 2008 - 21:47 #21
og så er der iøvrigt flere regler mht til opfyldning af pladen, - blot så du ved det:

15 tal

i 3 rækker med 10 kolonner

der må være 5 tal i hver rækker
kolonnerne repræsenterer hver ti'er - kombination
og fyldes derefter.

så eksempelvis

1    25    43    66      90
  11 23  33    50        89
8  10 28  34 44
Avatar billede cpufan Juniormester
27. maj 2008 - 21:48 #22
lidt svært at vise uden tabel-struktur åbenbart
Avatar billede l_otto Nybegynder
27. maj 2008 - 22:12 #23
takker
Avatar billede cpufan Juniormester
27. maj 2008 - 22:43 #25
Avatar billede l_otto Nybegynder
30. maj 2008 - 10:34 #26
Kan du lave det så der max kommer 3 tal for hver 10'er gruppe eks. 80-89

Og at det skrives ud i tabel form  således

1    25    43    66      90
  11 23  33    50        89
8  10 28  34 44

så første række er 1-9 næste 10-19 osv.

tak
Avatar billede frand Nybegynder
31. maj 2008 - 18:22 #27
prøv at leg med denne her

<%
Set pladecheck = Server.CreateObject("Scripting.Dictionary")
Set plader = Server.CreateObject("Scripting.Dictionary")

Randomize

'sorter et array
Function BSort(arr)
    Dim i, j, x
    For i=0 To UBound(arr)-1
        For j=i+1 To UBound(arr)
            If arr(i) > arr(j) Then
                x = arr(i)
                arr(i) = arr(j)
                arr(j) = x
            End If
        Next
    Next
    BSort = arr
End Function

' vis plade
Sub ShowPlade(plade)
    Dim i, j, s

    Response.Write "<table border=1 cellpadding=2 cellspacing=1 style=""margin-bottom:3px"">"

    For i=0 To Ubound(plade,1)
        Response.Write "<tr style=""width:50px"">"

        For j=0 To Ubound(plade,2)

            s = plade(i, j)
            If s = 0 Then s = "&nbsp;"

            Response.Write "<td style=""width:35px;text-align:center"">" & s & "</td>"
        Next

        Response.Write "</tr>"
    Next

    Response.Write "</table>"
End Sub

' træk ny plade
Function NewPlade()
    Dim i, j
    Dim num, plade, column
    ReDim plade(2,8)

    pladecheck.RemoveAll

    ' 3 rækker
    For i=0 To 2
        ' 5 tal i hver række
        j = 0
        Do
            num = Int(Rnd*90)+1 ' [1-90]

            ' er tallet allerede udtrukket?
            If Not pladecheck.Exists(num) Then

                column = Int(num/10)

                If num = 90 Then
                    ' "gamle ole" skal ligge sammen med 80'erne
                    column = column-1
                End If

                ' kolonne optaget?
                If plade(i, column) = 0 Then
                    plade(i, column) = num
                    pladecheck.Add num, 1
                    j = j+1
                End If
            End If
        Loop Until j=5
    Next

    NewPlade = plade
End Function

' træk x plader
For i=1 To 10
    Do
        plade = NewPlade()
        Call ShowPlade(plade)
        strPlade = Join(BSort(pladecheck.Keys), ",")
    Loop While plader.Exists(strPlade)
Next
%>
Avatar billede frand Nybegynder
31. maj 2008 - 18:24 #28
hov, hver plade skal lige tilføjes "plader"

' træk x plader
For i=1 To 10
    Do
        plade = NewPlade()
        Call ShowPlade(plade)
        strPlade = Join(BSort(pladecheck.Keys), ",")
    Loop While plader.Exists(strPlade)

    plader.Add strPlade, plade ' ****************
Next
Avatar billede l_otto Nybegynder
01. juni 2008 - 07:24 #29
smukt når jeg skal have 150 plader øndre jeg bare For i=1 To 10 til For i=1 To 150 ik

flot arbejde
Avatar billede frand Nybegynder
01. juni 2008 - 12:22 #30
Ja, den bestemmer antallet. ShowPlade er i øvrigt heller ikke placeret korrekt i den kodestump, den skal først kaldes, når pladen med sikkerhed er unik
Avatar billede l_otto Nybegynder
01. juni 2008 - 14:11 #31
kan du sætte den helt rigtige kode ind når der skal vises 1500 plader tak ;.)
Avatar billede l_otto Nybegynder
02. juni 2008 - 09:39 #32
nogen der kan hjælpe så den er 100% korrekt ? :-)
Avatar billede frand Nybegynder
02. juni 2008 - 12:33 #33
så burde den være der:

' træk x plader
For i=1 To 10
    Do
        plade = NewPlade()
        strPlade = Join(BSort(pladecheck.Keys), ",")
    Loop While plader.Exists(strPlade)

    ' nu har vi en unik plade
    Call ShowPlade(plade)
    plader.Add strPlade, plade ' sørg for at pladen ikke kan trækkes igen
Next
Avatar billede l_otto Nybegynder
02. juni 2008 - 14:41 #34
1000 tak
Avatar billede l_otto Nybegynder
09. juni 2008 - 11:15 #35
sidste ting

den skal vise tallene nede af i række følge

  15 23  40 59  78 
6 14 28 33        84
  13 22    58  72 87

ikke som nu kan du se det
Avatar billede l_otto Nybegynder
09. juni 2008 - 11:21 #36
så det mindste tal står øverst

22
23
28
Avatar billede frand Nybegynder
09. juni 2008 - 15:21 #37
Prøv med denne nye sub, og følgende ændring i NewPlade:

' sorter kolonne
Sub SortColumn(ByRef plade, column)
    Dim i, j, x

    For i=0 To 2
        If plade(i, column) > 0 Then
            For j=i+1 To 2
                If plade(j, column) > 0 And plade(i, column) > plade(j, column) Then
                    x = plade(i, column)
                    plade(i, column) = plade(j, column)
                    plade(j, column) = x
                End If
            Next
        End If
    Next
End Sub


' træk ny plade
Function NewPlade()
    Dim i, j
    Dim num, plade, column
    ReDim plade(2,8)

    pladecheck.RemoveAll

    ' 3 rækker
    For i=0 To 2
        ' 5 tal i hver række
        j = 0
        Do
            num = Int(Rnd*90)+1 ' [1-90]

            ' er tallet allerede udtrukket?
            If Not pladecheck.Exists(num) Then

                column = Int(num/10)

                If num = 90 Then
                    ' "gamle ole" skal ligge sammen med 80'erne
                    column = column-1
                End If

                ' kolonne optaget?
                If plade(i, column) = 0 Then
                    plade(i, column) = num
                    pladecheck.Add num, 1
                    j = j+1
                End If
            End If
        Loop Until j=5
    Next

    ' sorter kolonner
    For i=0 To UBound(plade, 2)
        Call SortColumn(plade, i)
    Next

    NewPlade = plade
End Function
Avatar billede l_otto Nybegynder
09. juni 2008 - 15:40 #38
er du ikke en ven at lave hele koden som den skal være :-) tak
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