RullaTärning (hjälp med programmering)

Trädvy Permalänk
Medlem
Plats
Umeå
Registrerad
Dec 2009

RullaTärning (hjälp med programmering)

Hej,

Behöver hjälp med nedan program. Väljer jag t.ex rulla 2 tärningar sedan väljer menyval 2 så kommer det ut 2 st tärningar med samma värde. Får inte riktigt till det med slumpvalda nr. Var är det det felar?

Tacksam för tips.

static int RullaTärning(Random slumpObjekt) { Random random = new Random(); int dice = random.Next(1, 6); return dice; } static void Main() { Random slump = new Random(); List<int> tärningar = new List<int>(); Console.WriteLine("\n\tVälkommen till tärningsgeneratorn!"); bool kör = true; while (kör) { Console.WriteLine("\n\t[1] Rulla tärning\n" + "\t[2] Kolla vad du rullade\n" + "\t[3] Avsluta"); Console.Write("\tVälj: "); int val; int.TryParse(Console.ReadLine(), out val); switch (val) { case 1: Console.Write("\n\tHur många tärningar vill du rulla: "); bool inmatning = int.TryParse(Console.ReadLine(), out int antal); if (inmatning) { for (int i = 0; i < antal; i++) { RullaTärning(slump); tärningar.Add(RullaTärning(slump)); } } break; case 2: Console.WriteLine("\n\tRullade tärningar: "); foreach (int tärning in tärningar) { Console.WriteLine("\t" + tärning); } break; case 3: Console.WriteLine("\n\tTack för att du rullade tärning!"); System.Threading.Thread.Sleep(1000); kör = false; break; default: Console.WriteLine("\n\tVälj 1-3 från menyn."); break; }

§3.1 /moderator
Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Jun 2007

Random är en så kalla pseudo-slumptalsgenerator, d.v.s. den är egentligen inte äkta slumpmässig utan räknar fram tal med en algoritm som ser slumpmässiga ut. Algoritmen som Random använder behöver ett så kallat seed-värde, ett värde som används för att starta algoritmen. Skapar man flera Random-objekt med samma seed så kommer man få samma följd av slumptal.

Problemet här är att när man skapar ett Random-objekt utan något argument så används något värde som beror på tiden som seed, t.ex. systemets tid i millisekunder eller nåt. Eftersom du anropar RullaTärning flera gånger direkt efter varandra och skapar ett nytt Random-objekt varje gång så hinner troligtvis inte tillräckligt med tid gå mellan anropen, så du får samma seed varje gång. Lösningen är att skapa ett Random-objekt och använda det överallt istället för att skapa ett nytt objekt varje gång du behöver ett slumptal.

I din kod så skickar du faktiskt in ett Random-objekt till din RullaTärning-funktion, men du ignorerar det och skapar ett nytt objekt som du använder istället. I din kod har du även:

for (int i = 0; i < antal; i++) { RullaTärning(slump); tärningar.Add(RullaTärning(slump)); }

Det första anropet till RullaTärning gör ingenting eftersom du inte sparar resultatet.

Trädvy Permalänk
Medlem
Registrerad
Jun 2017
Skrivet av micke_mj:

Hej,

Behöver hjälp med nedan program. Väljer jag t.ex rulla 2 tärningar sedan väljer menyval 2 så kommer det ut 2 st tärningar med samma värde. Får inte riktigt till det med slumpvalda nr. Var är det det felar?

Tacksam för tips.

List<int> tärningar = new List<int>();

Hur kan det där ens kompilera?
Det går inte att använda primitiva typer som int med generics. Du måste använda wrapper-typen Integer i så fall. Dessutom är List ett interface och kan således inte instansieras, du måste använda någon implementation av det som exempelvis ArrayList.

List<Integer> tärningar = new ArrayList<Integer>();

Trädvy Permalänk
Medlem
Plats
Borlänge
Registrerad
Jan 2003
Skrivet av MrDoggo:

Hur kan det där ens kompilera?
Det går inte att använda primitiva typer som int med generics. Du måste använda wrapper-typen Integer i så fall. Dessutom är List ett interface och kan således inte instansieras, du måste använda någon implementation av det som exempelvis ArrayList.

List<Integer> tärningar = new ArrayList<Integer>();

List<int> list = new List<int>();
fungerar utmärkt i C#

C#/MonoGame Fanatiker.
Pixel Artist & Game Developer

Trädvy Permalänk
Medlem
Registrerad
Jun 2017
Skrivet av AJL:

List<int> list = new List<int>();
fungerar utmärkt i C#

Oj såg inte att det var C#, var syntaktiskt så likt. Fånig jag kände mig nu, måste blandat ihop med Javatråden. Så blir det när man inte ser sharp.

Trädvy Permalänk
Medlem
Plats
Umeå
Registrerad
Dec 2009
Skrivet av perost:

Random är en så kalla pseudo-slumptalsgenerator, d.v.s. den är egentligen inte äkta slumpmässig utan räknar fram tal med en algoritm som ser slumpmässiga ut. Algoritmen som Random använder behöver ett så kallat seed-värde, ett värde som används för att starta algoritmen. Skapar man flera Random-objekt med samma seed så kommer man få samma följd av slumptal.

Problemet här är att när man skapar ett Random-objekt utan något argument så används något värde som beror på tiden som seed, t.ex. systemets tid i millisekunder eller nåt. Eftersom du anropar RullaTärning flera gånger direkt efter varandra och skapar ett nytt Random-objekt varje gång så hinner troligtvis inte tillräckligt med tid gå mellan anropen, så du får samma seed varje gång. Lösningen är att skapa ett Random-objekt och använda det överallt istället för att skapa ett nytt objekt varje gång du behöver ett slumptal.

I din kod så skickar du faktiskt in ett Random-objekt till din RullaTärning-funktion, men du ignorerar det och skapar ett nytt objekt som du använder istället. I din kod har du även:

for (int i = 0; i < antal; i++) { RullaTärning(slump); tärningar.Add(RullaTärning(slump)); }

Det första anropet till RullaTärning gör ingenting eftersom du inte sparar resultatet.

Så lösningen kan vara=)?

Trädvy Permalänk
Medlem
Plats
Umeå
Registrerad
Dec 2009

Letar o letar men vet ej vad som behövs göras, tacksam för hjälp!

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Jun 2007
Skrivet av micke_mj:

Så lösningen kan vara=)?

Mitt inlägg innehåller en mening som börjar med "lösningen är ..."

Trädvy Permalänk
Medlem
Plats
Umeå
Registrerad
Dec 2009
Skrivet av perost:

Mitt inlägg innehåller en mening som börjar med "lösningen är ..."

Mycket medveten, men vad innebär? Är VÄLDIGT GRÖN.

Lösningen är att skapa ett Random-objekt och använda det överallt istället för att skapa ett nytt objekt varje gång du behöver ett slumptal.

I din kod så skickar du faktiskt in ett Random-objekt till din RullaTärning-funktion, men du ignorerar det och skapar ett nytt objekt som du använder istället. I din kod har du även:

for (int i = 0; i < antal; i++)
{
RullaTärning(slump);
tärningar.Add(RullaTärning(slump));
}
Det första anropet till RullaTärning gör ingenting eftersom du inte sparar resultatet.

Trädvy Permalänk
Medlem
Plats
Umeå
Registrerad
Dec 2009
Skrivet av micke_mj:

Mycket medveten, men vad innebär? Är VÄLDIGT GRÖN.

Lösningen är att skapa ett Random-objekt och använda det överallt istället för att skapa ett nytt objekt varje gång du behöver ett slumptal.

I din kod så skickar du faktiskt in ett Random-objekt till din RullaTärning-funktion, men du ignorerar det och skapar ett nytt objekt som du använder istället. I din kod har du även:

for (int i = 0; i < antal; i++)
{
RullaTärning(slump);
tärningar.Add(RullaTärning(slump));
}
Det första anropet till RullaTärning gör ingenting eftersom du inte sparar resultatet.

SKall oxå nämnas att for loopen måste användas på ovan sätt enligt Lärare.

Trädvy Permalänk
Medlem
Plats
Umeå
Registrerad
Dec 2009
Skrivet av perost:

Mitt inlägg innehåller en mening som börjar med "lösningen är ..."

har nog läst ditt inlägg 45 ggr.

Trädvy Permalänk
Medlem
Plats
Örebro
Registrerad
Okt 2001

Efter 12år som systemutvecklare blir jag fortfarande lika förbannad när man namnger metoder, funktioner, klasser etc på svenska........

Sorry att jag är OT.

Trädvy Permalänk
Medlem
Plats
Umeå
Registrerad
Dec 2009
Skrivet av GonAce:

Efter 12år som systemutvecklare blir jag fortfarande lika förbannad när man namnger metoder, funktioner, klasser etc på svenska........

Sorry att jag är OT.

12 år som utvecklare kanske du har några tips;) förutom språket

Trädvy Permalänk
Medlem
Registrerad
Sep 2014

@micke_mj
Du måste nog gå igenom din kod lite och fundera över vad alla delar faktiskt gör och vad du tänkt att de ska göra. Har du skrivit programmet själv? För att döma av dina kommentarer känns det lite som att du bara skrivit av/kopierat och sedan inte kunnat se problemen.

@perost pekar ut problemen väldigt tydligt.
"I din kod så skickar du faktiskt in ett Random-objekt till din RullaTärning-funktion, men du ignorerar det och skapar ett nytt objekt som du använder istället."

Så vad menas med att du skickar in ett objekt men ignorerar det och skapar ett nytt?

static int RullaTärning(Random slumpObjekt) { Random random = new Random(); int dice = random.Next(1, 6); return dice; }

Din funktion tar in ett Random-objekt som du döper till "slumpObjekt", men du använder det aldrig. Istället skapar du upp ett nytt objekt genom:

Random random = new Random();

Som du sedan använder på raden efter. Vad händer om du tar bort denna bit kod och på raden efter använder objektet som du skickar in (slumpObjekt)?

"Det första anropet till RullaTärning gör ingenting eftersom du inte sparar resultatet."

for (int i = 0; i < antal; i++) { RullaTärning(slump); // Ett anrop till RullaTärning tärningar.Add(RullaTärning(slump)); // Här i anropas RullaTärning igen }

Så perost säger alltså att du anropar funktionen RullaTärning utan att den gör någonting för att du inte sparar resultatet. Själva funktionen skapar ju faktiskt ett ett nytt random-objekt, slumpar fram ett tal och skickar tillbaka det. Men eftersom du inte sparar ned resultatet, utan bara anropar funktionen så gör den ingen nytta. Du säger alltså: Skicka tillbaka ett resultat till mig som jag inte tänker använda. Jämför det med ditt andra anropp, vad händer där? Jo du rullar din tärning, skickar tillbaka resultatet och använder det genom att lägga till det i din lista genom täningar.Add().

Trädvy Permalänk
Medlem
Plats
Umeå
Registrerad
Dec 2009
Skrivet av noyce:

@micke_mj
Du måste nog gå igenom din kod lite och fundera över vad alla delar faktiskt gör och vad du tänkt att de ska göra. Har du skrivit programmet själv? För att döma av dina kommentarer känns det lite som att du bara skrivit av/kopierat och sedan inte kunnat se problemen.

@perost pekar ut problemen väldigt tydligt.
"I din kod så skickar du faktiskt in ett Random-objekt till din RullaTärning-funktion, men du ignorerar det och skapar ett nytt objekt som du använder istället."

Så vad menas med att du skickar in ett objekt men ignorerar det och skapar ett nytt?

static int RullaTärning(Random slumpObjekt) { Random random = new Random(); int dice = random.Next(1, 6); return dice; }

Din funktion tar in ett Random-objekt som du döper till "slumpObjekt", men du använder det aldrig. Istället skapar du upp ett nytt objekt genom:

Random random = new Random();

Som du sedan använder på raden efter. Vad händer om du tar bort denna bit kod och på raden efter använder objektet som du skickar in (slumpObjekt)?

"Det första anropet till RullaTärning gör ingenting eftersom du inte sparar resultatet."

for (int i = 0; i < antal; i++) { RullaTärning(slump); // Ett anrop till RullaTärning tärningar.Add(RullaTärning(slump)); // Här i anropas RullaTärning igen }

Så perost säger alltså att du anropar funktionen RullaTärning utan att den gör någonting för att du inte sparar resultatet. Själva funktionen skapar ju faktiskt ett ett nytt random-objekt, slumpar fram ett tal och skickar tillbaka det. Men eftersom du inte sparar ned resultatet, utan bara anropar funktionen så gör den ingen nytta. Du säger alltså: Skicka tillbaka ett resultat till mig som jag inte tänker använda. Jämför det med ditt andra anropp, vad händer där? Jo du rullar din tärning, skickar tillbaka resultatet och använder det genom att lägga till det i din lista genom täningar.Add().

Uppskattar din förklaring väldigt mkt, pedagogiskt, tack!