Avatar billede odsgaard Praktikant
16. januar 2014 - 13:44 Der er 15 kommentarer og
1 løsning

Terning eksempel virker ikke

Hej eksperter

Jeg sidder med et simpelt eksempel med en terning og et raflebæger (koden er nedenfor).

Det virker ikke helt efter hensigten, da alle terningerne i bægret har den samme værdi hver gang der slås et slag. Eksempelvis 444, 333, 666, 111, 333, 333 .... m.m.

Hvad skyldes det?

Hilsen
Brian

Koden:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;

namespace Die
{
  class Program
  {
      static void Main(string[] args)
      {
        DieCup cup = new DieCup();
        for (int i = 0; i < 10; i++)
        {
            Console.WriteLine(cup.roll());
        }
      }
  }

  class DieCup
  {
      ArrayList list = new ArrayList();
      public DieCup() {
        for (int i = 0; i < 3; i++)
        {
            list.Add(new Die());
        }
      }

      public String roll()
      {
        String s = "";
        foreach (Die d in list) {
            d.roll();
            s += d.roll();
        }
        return s;
      }
  }

  class Die
  {
      Random rand = new Random();
      public int roll()
      {
        return rand.Next(1, 7);
      }
  }
}
Avatar billede HKW Nybegynder
16. januar 2014 - 14:02 #1
list.Add(new Die());
System.Threading.Thread.Sleep(15);

static Random rand = new Random();

Begge gør en forskel. Det handler om seed.
Avatar billede Slater Ekspert
16. januar 2014 - 14:02 #2
De fleste random funktioner i programmeringssprog laver et tilfældigt tal ud fra tidspunktet. Dvs. hvis du kører rand-funktionen flere gange i træk, uden millisekundet har nået at skifte, får du samme tal ud hver gang.
Avatar billede Slater Ekspert
16. januar 2014 - 14:05 #3
Jeg må lige sige at jeg er lidt rusten i C#, men ifølge dokumentationen ( http://msdn.microsoft.com/en-us/library/system.random%28v=vs.110%29.aspx ) kan du seede Random objektet.

Hvis du laver et nyt Random objekt for hver gang du bruger det, og parser forskellige tal ind i constructoren, f.eks new Random(123); new Random(987), osv. så burde du få forskellige resultater.
Avatar billede HKW Nybegynder
16. januar 2014 - 14:07 #4
Hvis ikke du har brug for en unik random-generator til hver terning, så ville jeg brug static-metoden. Så deles alle terninger om den samme.
Avatar billede kalp Novice
16. januar 2014 - 14:07 #5
Du kalder new på Random hver gang.. og så skaber det problemer i en loop som din.
Hvis du har én instans af Random i stedet så virker det fint:)
Avatar billede kalp Novice
16. januar 2014 - 14:10 #6
Nu siger jeg ikke det er SÅDAN her du SKAL gøre det, men bare som eksempel så ville det har virke:

class DieCup
    {
        ArrayList list = new ArrayList();
        Random rand = new Random();

        public DieCup()
        {
            for (int i = 0; i < 3; i++)
            {
                list.Add(new Die());
            }
        }

        public String roll()
        {
            String s = "";
            foreach (Die d in list)
            {
                s += d.roll(rand);
            }
            return s;
        }
    }

    class Die
    {
        public int roll(Random rand)
        {
            return rand.Next(1, 7);
        }
    }
Avatar billede HKW Nybegynder
16. januar 2014 - 14:14 #7
#6

Det finder jeg logisk forkert. Hvorfor skal bægeret bekymre sig om en tilfældighedsgenerator?
Avatar billede Slater Ekspert
16. januar 2014 - 14:14 #8
Og ja, lyt til de andre. C# har aldrig været et af mine primære sprog, så de har tydeligvis mere forstand på det end mig.
Avatar billede kalp Novice
16. januar 2014 - 14:22 #9
HKW >> Du skal som sådan heller ikke benytte mit design - ovenstående er blot for at påpege hvad der går galt:)

Dit spørgsmål var jo bare hvorfor det ikke virker;)

Hvis du vil have mit bud på design kan jeg sagtens komme med det:D
Avatar billede kalp Novice
16. januar 2014 - 14:24 #10
Du kan i øvrigt i din egen kode bare skrive:
static Random rand = new Random();

så vil det jo også virke. Static = én instans.
og så beholder du DIT design:)
Avatar billede HKW Nybegynder
16. januar 2014 - 14:24 #11
Jeg har ikke stillet spørgsmålet :-)
Avatar billede odsgaard Praktikant
16. januar 2014 - 14:26 #12
Jeg har ikke den store erfaring med C# endnu, men det kommer forhåbentlig :)

Jeg kan se at det virker fint med static metoden, men også hvis jeg anvender thread.sleep().

Det skal jeg lige skrive mig bag øret, hvis jeg skal bruge Random() klassen fremover. I Java har jeg ikke oplevet det problem.

Tak for svarene - dem der vil dele pointene kan smide et svar tilbage :)

/Brian
Avatar billede kalp Novice
16. januar 2014 - 14:28 #13
HKW lol :D oh well:P
Avatar billede kalp Novice
16. januar 2014 - 14:33 #14
Glem i øvrigt mit svar -  skal ikke have point:D  HKW havde skrevet præcis det med static OG det er pænere end thread.sleep.. ikke det store problem lige i dette projekt, men i mange andre situationer er det pænt upraktisk at lave sleep for sådan en funktion:D
Avatar billede odsgaard Praktikant
16. januar 2014 - 14:52 #15
@kalp - nu fik du pointene alligevel

@HKW - tak for dit input. Ved nærmere eftertanke, er det jo også static man tilgår Random() i java ....
Avatar billede arne_v Ekspert
16. januar 2014 - 16:47 #16
Problem stillingen er helt klassisk og ses i alle sprog.

Den er ogsaa omtalt i min artikel:

http://www.eksperten.dk/guide/680
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