Avatar billede coldray Nybegynder
19. juni 2007 - 14:05 Der er 10 kommentarer og
1 løsning

Tilfældige tal!

Hejsa Eksperter!

Jeg arbejder på et lille terningespil, og er også ved at være ved vejs ende - problemet er bare knas med de pseudotilfældige tal:

Random rand = new Random(unchecked((int)DateTime.Now.Ticks));

...
int[] playerDice = new int[6];
int[] computerDice = new int[6];
...
playerDice = generateNumbers();
computerDice = generateNumbers();

...

public int[] generateNumbers()
{
    for(int i = 0; i < 6; i++)
    {
        intArray[i] = rand.Next(1,7);
    }

    return intArray;
}

...

Det fungerer fint med at generere de 'tilfældige' tal, men problemet er at tallene som brugeren og som den computerstyrede modstander har, er næsten identiske hver eneste gang, det er kun de 1-2 sidste terninger der afviger!
Avatar billede coldray Nybegynder
19. juni 2007 - 14:07 #1
Ahh.. rettelse, de to talarrays er identiske
Avatar billede arne_v Ekspert
19. juni 2007 - 14:08 #2
Jeg tror at du genererer et Random objekt for hver.

De skal dele det samme Ransom objekt.
Avatar billede coldray Nybegynder
19. juni 2007 - 14:10 #3
Jeg genererer allerede Random rand samt definerer de to arrays inden min Form_Load, og så kalder jeg generateNumbers()-funktionen ved en commandbutton, så går ikke ud fra det er tilfældet?
Avatar billede arne_v Ekspert
19. juni 2007 - 14:19 #4
Proev og lav den static.
Avatar billede coldray Nybegynder
19. juni 2007 - 14:23 #5
Altså static Random rand = new Random(unchecked((int)DateTime.Now.Ticks)); ?

Det er hermed afprøvet, men giver samme resultat!

Et andet alternativ kunne være at generere 12 'tilfældige' tal istedet for 6, og så plotte ind i de to arrays under samme kald, men det løser stadig ikke denne problem-stilling, som jeg kunne ende i igen en anden gang :(
Avatar billede coldray Nybegynder
19. juni 2007 - 14:27 #6
Det må blive det jeg gør så, har ændret lidt i generateNumbers, så den ikke returnerer noget, men derimod er således:

public void generateNumbers()
{
    for(int i = 0; i < 6; i++)
    {
        playerDice[i] = rand.Next(1,7);
    }

    for(int i = 0; i < 6; i++)
    {
        computerDice[i] = rand.Next(1,7);
    }
}

hermed testet og virker.
Avatar billede bitmatic Nybegynder
19. juni 2007 - 14:30 #7
problemet ligger nok i intArray.

Både playerDice og computerDice ender med at indeholde en reference til det samme intArray.

Du er altså nødt til at lave et nyt array i funktionen.

public int[] generateNumbers()
{
    int[] intArray = new int[6];

    for(int i = 0; i < 6; i++)
    {
        intArray[i] = rand.Next(1,7);
    }

    return intArray;
}
Avatar billede neoman Novice
19. juni 2007 - 14:35 #8
Hverken eller : problemet er Rand - funktionen. En rand med samme seed genererer altid samme række af pseudetilfældige tal.

Funktionen husker hvor langt den er kommet, men hver gang du starter den med samme seed, så kører rækken forfra - medmindre dens forudgående værdi ligger gemt i en static f.eks.
Avatar billede bitmatic Nybegynder
19. juni 2007 - 14:47 #9
Han genererer kun ét random objekt, som funktionen så bruger. rand.Next() vil altså ikke starte forfra i rækkefølgen hver gang.

Og i øvrigt bruger han DateTime.Now.Ticks som seed.
Avatar billede neoman Novice
19. juni 2007 - 14:52 #10
Ikke helt:

public int[] generateNumbers()
{
    for(int i = 0; i < 6; i++)
    {
        intArray[i] = rand.Next(1,7);
    }

    return intArray;
}
startede forfra, da den blev kaldt to gange, på en rand med samme seed - og det var dét som voldte problemet i første omgang

Nu kører coldray
public void generateNumbers()
{
    for(int i = 0; i < 6; i++)
    {
        playerDice[i] = rand.Next(1,7);
    }

    for(int i = 0; i < 6; i++)
    {
        computerDice[i] = rand.Next(1,7);
    }
}

som fortsætter en række, og derfor virker det fint:)
Avatar billede bitmatic Nybegynder
19. juni 2007 - 15:41 #11
nej...

Eftersom rand objektet lever udenfor generateNumbers funktionen vil rand.Next() ikke starte forfra hver gang.

Nu er det jo svært at være stålsat på noget når man kun har set brudstykker af koden, men jeg er helt overbevist om at problemet skyldtes at de to arrays oprindeligt endte med at være sat til samme reference.
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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