Avatar billede hobbittend Novice
18. januar 2010 - 11:05 Der er 7 kommentarer og
1 løsning

System.Random ser ikke så random ud igen..

Hej.

Jeg er ved at kode et blackjack spil i skolen. Dertil blander jeg kortene ved at generere nogle tilfældige til i et array, mellem 1 og 53 (dvs. t.o.m 52).. Mit array er har 260 pladser fordi jeg vil kunne spille med 5 kortspil efter hinanden, ligesom på et rigtigt kasino. (Det skal blive variabelt senere)
Mit problem er, at det ikke ser rigtigt tilfældigt ud.. I mit array ligger der mange steder 2 og 3 ens tal op ad hinanden, og de sidste 3-4 cifre er meget ofte ens... Chancen for 4 ens tal fra 1-52 i rap, er ikke særligt stor... Kan i forklare hvorfor det sker så hyppigt?

Koden:

Dim RandonNumber As New Random()
Dim Nummer As Integer
Dim AntalKort As Integer = 260
Dim Liste(AntalKort - 1) As Integer
Dim Allerede(52)
        For i = 1 To AntalKort
            Nummer = RandonNumber.Next(1, 53)
                        For u = 1 To i
                If Allerede(Nummer) >= 5 Then
                        i -= 1
                    Exit For
                End If
            Next
                If Allerede(Nummer) < 5 Then
                Allerede(Nummer) += 1
                Liste(i - 1) = Nummer
            End If
        Next
Avatar billede arne_v Ekspert
18. januar 2010 - 13:31 #1
Hvor hyppigt er hyppigt?

Algoritme maessigt ville jeg overveje at fylde Liste i raekkefoelge og saa lave en random shuffle.
Avatar billede arne_v Ekspert
18. januar 2010 - 15:23 #2
Demo:

        Dim a() As Integer = New Integer(5*52) { }
        For i As Integer = 0 To a.Length - 1
            a(i) = i mod 52 + 1
        Next
        Dim rng As Random = New Random
        Dim b() As Integer = New Integer(5*52) { }
        For i As Integer = 0 To b.Length - 1
            b(i) = rng.Next
        Next
        Array.Sort(b, a)
Avatar billede PseudoFrag Nybegynder
19. januar 2010 - 10:58 #3
En mulighed  for dette kan være at det er fordi random funktionene anvender OS systemets indbygget random og denne er på Vista og XP ikke særlig velegnet til at give en god tilfældighed.
Avatar billede arne_v Ekspert
24. januar 2010 - 01:22 #4
System.Random bruger en subtracktions algoritme fra Knuth.

CRTL rand bruger en relativ simpel LCG dog med bortsmidning af low bits.

Win32 API har kun CryptGenRandom, som skulle være tilfældig nok til kryptografisk brug.
Avatar billede hobbittend Novice
01. februar 2010 - 10:05 #5
Arne_v:

Tak for hjælpen. Det virker meget bedre.
Skal bruge det til eksamenen så det er ret vigtigt at jeg forstår koden.
Har jeg ret i at
For i As Integer = 0 To a.Length - 1
            a(i) = i mod 52 + 1
        Next
Fylder en tabel med tallene 1-52 i rækkefølge og at
Dim rng As Random = New Random
        Dim b() As Integer = New Integer(5*52) { }
        For i As Integer = 0 To b.Length - 1
            b(i) = rng.Next
Fylder en tabel med fuldstændigt tilfældige tal.

Array.Sort(b, a)

sortere arrayet, men hvad indikerer de to parametre nøjagtigt?
Avatar billede arne_v Ekspert
01. februar 2010 - 13:53 #6
Tricket er at man hvis:

a = sorteret raekkefoelge
b = tilfaeldig raekkefoelge

saa vil

Array.Sort(b, a)

sortere efter b saaledes at:

a = tilfaeldig raekkefoelge
b = sorteret raekkefoelge
Avatar billede hobbittend Novice
01. februar 2010 - 14:21 #7
Super =)
Jeg takker for hjælpen :)

Hvis du vil have pointene kan du bare ligge et svar
Avatar billede arne_v Ekspert
01. februar 2010 - 15:40 #8
svar
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