Avatar billede lordsaxo Nybegynder
09. december 2005 - 09:41 Der er 9 kommentarer og
1 løsning

Random tal med C#?

Jeg skal lave en funktion der vælger et tilfældigt ord fra en list. Jeg har valgt at lave en string[] med alle ord. Min kode for at tage det tilfældige ord og sætte det til string Facit, ser således ud:

string[] MineOrd = {
            "PROGRAMMERING",
            "KARTOFFEL",
            "NINTENDO",
            "GAMECUBE",
            "GAMEBOY",
            "LYKKEHJULET"
        };
Random random = new Random(); // Her vælger
int RandomOrd = random.Next(0, 5); // Jeg et
public string Facit = AlleOrd[RandomOrd].ToString();

Jeg får disse fejl:
A field initializer cannot reference the nonstatic field, method or property 'Lykkehjulet.Lykkehjulet.random'

A field initializer cannot reference the nonstatic field, method or property 'Lykkehjulet.Lykkehjulet.MineOrd'

A field initializer cannot reference the nonstatic field, method or property 'Lykkehjulet.Lykkehjulet.RandomOrd'


Er der nogle som kan se hvad jeg gør galt? Og hvad den mener med de fejl der?
Avatar billede nielle Nybegynder
09. december 2005 - 09:52 #1
F.eks. sådan her:

static string[] MineOrd = {
                              "PROGRAMMERING",
                              "KARTOFFEL",
                              "NINTENDO",
                              "GAMECUBE",
                              "GAMEBOY",
                              "LYKKEHJULET"
                          };
public string Facit = MineOrd[(new Random()).Next(1, 5)].ToString();
Avatar billede nielle Nybegynder
09. december 2005 - 09:54 #2
... eller:

static string[] MineOrd = {
                              "PROGRAMMERING",
                              "KARTOFFEL",
                              "NINTENDO",
                              "GAMECUBE",
                              "GAMEBOY",
                              "LYKKEHJULET"
                          };
static Random random = new Random(); // Her vælger
static int RandomOrd = random.Next(0, 5); // Jeg et
public string Facit = MineOrd[RandomOrd].ToString();
Avatar billede lordsaxo Nybegynder
09. december 2005 - 10:08 #3
Tusind tak, fik den første til at virke. Og den er jo noget nemmere. ;)

Smid lige et svar, så får du point (har også siddet og ledt efter en nemmere metode i et stykke tid. ;))
Avatar billede nielle Nybegynder
09. december 2005 - 10:18 #4
Det var også derfor at jeg gav den først - men så blev jeg lidt i tvivl om du skulle bruge variablen random andre steder i din kode - derfor også den anden.
Avatar billede jens87 Nybegynder
12. december 2005 - 14:02 #5
Så vidt jeg kan se har du 6 items i dit string array. De vil således blive indekseret fra 0 til og med 5. Når du vælger random ned random.Next(0,5) tages 0 med, men 5 gør ikke, dvs, du aldrig får valgt ordet "LYKKEHJULET". Hvis du vil ha det med, skal det være random.Next(0.6).
Dokumentationen kan ses på http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemrandomclassnexttopic3.asp, kig under "Return value".
Avatar billede nielle Nybegynder
12. december 2005 - 17:59 #6
Den mest hårdføre måde at gøre det på er denne version:

static string[] MineOrd = {
                              "PROGRAMMERING",
                              "KARTOFFEL",
                              "NINTENDO",
                              "GAMECUBE",
                              "GAMEBOY",
                              "LYKKEHJULET"
                          };
public string Facit = MineOrd[(new Random()).Next(0, MineOrd.Length)].ToString();
Avatar billede lordsaxo Nybegynder
16. december 2005 - 00:23 #7
Tak for svarene begge to. Mit array indeholder nu over 50 ord, og jeg bruger noget lignende den sidste metode nielle skrev. Det virker super godt. ;)

Mit lykkehjul er efterhånden blevet nogenlunde avanceret, og nu er jeg allerede løbet ind i problemer igen. I skal være velkommen til at svare på min nye spørgsmål også, som jeg opretter nu. ;)

Endnu engang, tak for hjælpen.
Avatar billede arne_v Ekspert
16. december 2005 - 00:28 #8
principielt bør man undgå at lave et nyt Random objekt for hver instans
Avatar billede nielle Nybegynder
16. december 2005 - 17:10 #9
Arne_v har selvfølgelig ret, selvom grundene ikke kun er af principiel karakter, men også i allerhøjeste grad af praktisk karakter!

Dette kan man selv overbevise sig om ved at sammenligne disse to stykker kode, som overfladisk ser ud til at opføre sig ens, men som i virkeligheden giver en vidt forskellig opførsel:

Eksempel 1 (FORKERT):

using System;

namespace e670811_v1
{
    class Class1
    {
        [STAThread]
        static void Main(string[] args)
        {
            MineOrdClass moc1 = new MineOrdClass();
            MineOrdClass moc2 = new MineOrdClass();

            Console.WriteLine("{0} {1}", moc1, moc2);
        }
    }

    class MineOrdClass
    {
        static string[] MineOrd = {
                                      "PROGRAMMERING",
                                      "KARTOFFEL",
                                      "NINTENDO",
                                      "GAMECUBE",
                                      "GAMEBOY",
                                      "LYKKEHJULET"
                                  };
        public string Facit = MineOrd[(new Random()).Next(0, MineOrd.Length)].ToString();

        public override string ToString()
        {
            return Facit;
        }
    }
}


Eksempel 2 (KORREKT):

using System;

namespace e670811_v2
{
    class Class1
    {
        [STAThread]
        static void Main(string[] args)
        {
            MineOrdClass moc1 = new MineOrdClass();
            MineOrdClass moc2 = new MineOrdClass();

            Console.WriteLine("{0} {1}", moc1, moc2);
        }
    }

    class MineOrdClass
    {
        static string[] MineOrd = {
                                      "PROGRAMMERING",
                                      "KARTOFFEL",
                                      "NINTENDO",
                                      "GAMECUBE",
                                      "GAMEBOY",
                                      "LYKKEHJULET"
                                  };
        static Random fate = new Random();
        public string Facit = MineOrd[fate.Next(0, MineOrd.Length)].ToString();

        public override string ToString()
        {
            return Facit;
        }
    }
}

Denne falgruppe er rent faktisk nævnt, om end ikke helt på ovenstående måde (se kodeeksemplet: BadRng1.java), i Arne_v's udemærkede artikler om tilfældige tal:

http://www.eksperten.dk/artikler/680

- og:

http://www.eksperten.dk/artikler/686
Avatar billede arne_v Ekspert
16. december 2005 - 17:20 #10
jeg valgte det forsigtige "principielt" fordi jeg udfra namespace gættede på
at der ikke skulle instantieres så tit
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